Merge branch 'master' into feature_extruder_warning_icon

This commit is contained in:
fieldOfView 2021-08-24 17:39:28 +02:00
commit 96a1019f1e
523 changed files with 18237 additions and 8901 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

@ -28,6 +28,6 @@
<image>https://raw.githubusercontent.com/Ultimaker/Cura/master/screenshot.png</image>
</screenshot>
</screenshots>
<url type="homepage">https://ultimaker.com/en/products/cura-software?utm_source=cura&amp;utm_medium=software&amp;utm_campaign=resources</url>
<url type="homepage">https://ultimaker.com/software/ultimaker-cura?utm_source=cura&amp;utm_medium=software&amp;utm_campaign=cura-update-linux</url>
<translation type="gettext">Cura</translation>
</component>

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

@ -35,7 +35,7 @@ class CuraActions(QObject):
# Starting a web browser from a signal handler connected to a menu will crash on windows.
# So instead, defer the call to the next run of the event loop, since that does work.
# Note that weirdly enough, only signal handlers that open a web browser fail like that.
event = CallFunctionEvent(self._openUrl, [QUrl("https://ultimaker.com/en/resources/manuals/software")], {})
event = CallFunctionEvent(self._openUrl, [QUrl("https://ultimaker.com/en/resources/manuals/software?utm_source=cura&utm_medium=software&utm_campaign=dropdown-documentation")], {})
cura.CuraApplication.CuraApplication.getInstance().functionEvent(event)
@pyqtSlot()

View File

@ -161,7 +161,7 @@ class CuraApplication(QtApplication):
self.default_theme = "cura-light"
self.change_log_url = "https://ultimaker.com/ultimaker-cura-latest-features"
self.change_log_url = "https://ultimaker.com/ultimaker-cura-latest-features?utm_source=cura&utm_medium=software&utm_campaign=cura-update-features"
self._boot_loading_time = time.time()
@ -471,6 +471,7 @@ class CuraApplication(QtApplication):
("definition_changes", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.DefinitionChangesContainer, "application/x-uranium-instancecontainer"),
("variant", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.VariantInstanceContainer, "application/x-uranium-instancecontainer"),
("setting_visibility", SettingVisibilityPresetsModel.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.SettingVisibilityPreset, "application/x-uranium-preferences"),
("machine", 2): (Resources.DefinitionContainers, "application/x-uranium-definitioncontainer")
}
)
@ -1798,8 +1799,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 +1811,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

@ -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

@ -24,7 +24,7 @@ if TYPE_CHECKING:
from cura.OAuth2.Models import UserProfile, OAuth2Settings
from UM.Preferences import Preferences
MYCLOUD_LOGOFF_URL = "https://mycloud.ultimaker.com/logoff"
MYCLOUD_LOGOFF_URL = "https://account.ultimaker.com/logoff?utm_source=cura&utm_medium=software&utm_campaign=change-account-before-adding-printers"
class AuthorizationService:
"""The authorization service is responsible for handling the login flow, storing user credentials and providing
@ -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)
@ -207,25 +209,27 @@ class AuthorizationService:
link to force the a browser logout from mycloud.ultimaker.com
:return: The authentication URL, properly formatted and encoded
"""
auth_url = "{}?{}".format(self._auth_url, urlencode(query_parameters_dict))
auth_url = f"{self._auth_url}?{urlencode(query_parameters_dict)}"
if force_browser_logout:
# The url after '?next=' should be urlencoded
auth_url = "{}?next={}".format(MYCLOUD_LOGOFF_URL, quote_plus(auth_url))
connecting_char = "&" if "?" in MYCLOUD_LOGOFF_URL else "?"
# The url after 'next=' should be urlencoded
auth_url = f"{MYCLOUD_LOGOFF_URL}{connecting_char}next={quote_plus(auth_url)}"
return auth_url
def _onAuthStateChanged(self, auth_response: AuthenticationResponse) -> None:
"""Callback method for the authentication flow."""
if auth_response.success:
Logger.log("d", "Got callback from Authorization state. The user should now be logged in!")
self._storeAuthData(auth_response)
self.onAuthStateChanged.emit(logged_in = True)
else:
Logger.log("d", "Got callback from Authorization state. Something went wrong: [%s]", auth_response.err_message)
self.onAuthenticationError.emit(logged_in = False, error_message = auth_response.err_message)
self._server.stop() # Stop the web server at all times.
def loadAuthDataFromPreferences(self) -> None:
"""Load authentication data from preferences."""
Logger.log("d", "Attempting to load the auth data from preferences.")
if self._preferences is None:
Logger.log("e", "Unable to load authentication data, since no preference has been set!")
return
@ -237,11 +241,16 @@ class AuthorizationService:
user_profile = self.getUserProfile()
if user_profile is not None:
self.onAuthStateChanged.emit(logged_in = True)
Logger.log("d", "Auth data was successfully loaded")
else:
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)
Logger.log("w", "Unable to load auth data from preferences")
self._unable_to_get_data_message.show()
except (ValueError, TypeError):
Logger.logException("w", "Could not load auth data from preferences")
@ -259,6 +268,7 @@ class AuthorizationService:
self._user_profile = self.getUserProfile()
self._preferences.setValue(self._settings.AUTH_DATA_PREFERENCE_KEY, json.dumps(auth_data.dump()))
else:
Logger.log("d", "Clearing the user profile")
self._user_profile = None
self._preferences.resetPreference(self._settings.AUTH_DATA_PREFERENCE_KEY)

View File

@ -43,6 +43,10 @@ class KeyringAttribute:
self._store_secure = False
Logger.log("i", "Access to the keyring was denied.")
return getattr(instance, self._name)
except UnicodeDecodeError:
self._store_secure = False
Logger.log("w", "The password retrieved from the keyring cannot be used because it contains characters that cannot be decoded.")
return getattr(instance, self._name)
else:
return getattr(instance, self._name)

View File

@ -1,4 +1,4 @@
# Copyright (c) 2020 Ultimaker B.V.
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional, TYPE_CHECKING, cast, List
@ -74,6 +74,7 @@ class PreviewPass(RenderPass):
self._shader.setUniformValue("u_faceId", -1) # Don't render any selected faces in the preview.
else:
Logger.error("Unable to compile shader program: overhang.shader")
return
if not self._non_printing_shader:
self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader"))

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

@ -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

@ -93,7 +93,7 @@ class Snapshot:
pixel_output = preview_pass.getOutput()
try:
min_x, max_x, min_y, max_y = Snapshot.getImageBoundaries(pixel_output)
except ValueError:
except (ValueError, AttributeError):
return None
size = max((max_x - min_x) / render_width, (max_y - min_y) / render_height)

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

@ -159,7 +159,8 @@ class CuraEngineBackend(QObject, Backend):
self._slicing_error_message = Message(
text = catalog.i18nc("@message", "Slicing failed with an unexpected error. Please consider reporting a bug on our issue tracker."),
title = catalog.i18nc("@message:title", "Slicing failed")
title = catalog.i18nc("@message:title", "Slicing failed"),
message_type = Message.MessageType.ERROR
)
self._slicing_error_message.addAction(
action_id = "report_bug",
@ -391,7 +392,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 +424,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 +450,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 +461,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 +472,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 +487,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

@ -49,11 +49,27 @@ Item
id: searchBar
Layout.fillWidth: true
implicitHeight: createNewProjectButton.height
leftPadding: searchIcon.width + UM.Theme.getSize("default_margin").width * 2
onTextEdited: manager.projectFilter = text //Update the search filter when editing this text field.
leftIcon: UM.Theme.getIcon("Magnifier")
placeholderText: "Search"
UM.RecolorImage
{
id: searchIcon
anchors
{
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: UM.Theme.getSize("default_margin").width
}
source: UM.Theme.getIcon("search")
height: UM.Theme.getSize("small_button_icon").height
width: height
color: UM.Theme.getColor("text")
}
}
Cura.SecondaryButton
@ -76,12 +92,11 @@ Item
id: upgradePlanButton
text: "Upgrade plan"
iconSource: UM.Theme.getIcon("LinkExternal")
iconSource: UM.Theme.getIcon("external_link")
visible: createNewProjectButtonVisible && !manager.userAccountCanCreateNewLibraryProject && (manager.retrievingProjectsStatus == DF.RetrievalStatus.Success || manager.retrievingProjectsStatus == DF.RetrievalStatus.Failed)
tooltip: "You have reached the maximum number of projects allowed by your subscription. Please upgrade to the Professional subscription to create more projects."
tooltipWidth: parent.width * 0.5
tooltip: "Maximum number of projects reached. Please upgrade your subscription to create more projects."
onClicked: Qt.openUrlExternally("https://ultimaker.com/software/ultimaker-essentials/sign-up-cura?utm_source=cura&utm_medium=software&utm_campaign=lib-max")
onClicked: Qt.openUrlExternally("https://ultimaker.com/software/enterprise-software?utm_source=cura&utm_medium=software&utm_campaign=MaxProjLink")
}
}
@ -124,7 +139,7 @@ Item
id: visitDigitalLibraryButton
anchors.horizontalCenter: parent.horizontalCenter
text: "Visit Digital Library"
onClicked: Qt.openUrlExternally(CuraApplication.ultimakerDigitalFactoryUrl + "/app/library")
onClicked: Qt.openUrlExternally(CuraApplication.ultimakerDigitalFactoryUrl + "/app/library?utm_source=cura&utm_medium=software&utm_campaign=empty-library")
visible: searchBar.text === "" //Show the link to Digital Library when there are no projects in the user's Library.
}
}

View File

@ -0,0 +1,15 @@
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from cura.CuraApplication import CuraApplication
from UM.Message import Message
from UM.Version import Version
def getBackwardsCompatibleMessage(text: str, title: str, lifetime: int, message_type_str: str) -> Message:
if CuraApplication.getInstance().getAPIVersion() < Version("7.7.0"):
return Message(text=text, title=title, lifetime=lifetime)
else:
message_type = Message.MessageType.NEUTRAL
if ("MessageType." + message_type_str) in [str(item) for item in Message.MessageType]:
message_type = Message.MessageType[message_type_str]
return Message(text=text, title=title, lifetime=lifetime, message_type=message_type)

View File

@ -14,6 +14,7 @@ from UM.Logger import Logger
from UM.Message import Message
from UM.Scene.SceneNode import SceneNode
from cura.CuraApplication import CuraApplication
from .BackwardsCompatibleMessage import getBackwardsCompatibleMessage
from .DFLibraryFileUploadRequest import DFLibraryFileUploadRequest
from .DFLibraryFileUploadResponse import DFLibraryFileUploadResponse
from .DFPrintJobUploadRequest import DFPrintJobUploadRequest
@ -69,10 +70,11 @@ class DFFileExportAndUploadManager:
use_inactivity_timer = False
)
self._generic_success_message = Message(
self._generic_success_message = getBackwardsCompatibleMessage(
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_str = "POSITIVE"
)
self._generic_success_message.addAction(
"open_df_project",
@ -81,8 +83,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.
@ -218,10 +218,11 @@ class DFFileExportAndUploadManager:
# Set the progress to 100% when the upload job fails, to avoid having the progress message stuck
self._file_upload_job_metadata[filename]["upload_status"] = "failed"
self._file_upload_job_metadata[filename]["upload_progress"] = 100
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = Message(
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
text = "Failed to export the file '{}'. The upload process is aborted.".format(filename),
title = "Export error",
lifetime = 0
lifetime = 0,
message_type_str = "ERROR"
)
self._on_upload_error()
self._onFileUploadFinished(filename)
@ -240,10 +241,11 @@ class DFFileExportAndUploadManager:
self._file_upload_job_metadata[filename_3mf]["upload_progress"] = 100
human_readable_error = self.extractErrorTitle(reply_string)
self._file_upload_job_metadata[filename_3mf]["file_upload_failed_message"] = Message(
self._file_upload_job_metadata[filename_3mf]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
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_str = "ERROR"
)
self._on_upload_error()
self._onFileUploadFinished(filename_3mf)
@ -262,10 +264,11 @@ class DFFileExportAndUploadManager:
self._file_upload_job_metadata[filename_ufp]["upload_progress"] = 100
human_readable_error = self.extractErrorTitle(reply_string)
self._file_upload_job_metadata[filename_ufp]["file_upload_failed_message"] = Message(
self._file_upload_job_metadata[filename_ufp]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
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_str = "ERROR"
)
self._on_upload_error()
self._onFileUploadFinished(filename_ufp)
@ -298,10 +301,11 @@ class DFFileExportAndUploadManager:
self._file_upload_job_metadata[filename]["upload_status"] = "failed"
self._file_upload_job_metadata[filename]["upload_progress"] = 100
human_readable_error = self.extractErrorTitle(reply_string)
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = Message(
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
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_str = "ERROR"
)
self._on_upload_error()
@ -316,7 +320,7 @@ class DFFileExportAndUploadManager:
def _onMessageActionTriggered(self, message, action):
if action == "open_df_project":
project_url = "{}/app/library/project/{}?wait_for_new_files=true".format(CuraApplication.getInstance().ultimakerDigitalFactoryUrl, self._library_project_id)
project_url = "{}/app/library/project/{}?wait_for_new_files=true&utm_source=cura&utm_medium=software&utm_campaign=saved-library-file-message".format(CuraApplication.getInstance().ultimakerDigitalFactoryUrl, self._library_project_id)
QDesktopServices.openUrl(QUrl(project_url))
message.hide()
@ -334,15 +338,17 @@ class DFFileExportAndUploadManager:
"upload_progress" : -1,
"upload_status" : "",
"file_upload_response": None,
"file_upload_success_message": Message(
"file_upload_success_message": getBackwardsCompatibleMessage(
text = "'{}' was uploaded to '{}'.".format(filename_3mf, self._library_project_name),
title = "Upload successful",
lifetime = 0,
message_type_str = "POSITIVE"
),
"file_upload_failed_message": Message(
"file_upload_failed_message": getBackwardsCompatibleMessage(
text = "Failed to upload the file '{}' to '{}'.".format(filename_3mf, self._library_project_name),
title = "File upload error",
lifetime = 0
lifetime = 0,
message_type_str = "ERROR"
)
}
job_3mf = ExportFileJob(self._file_handlers["3mf"], self._nodes, self._file_name, "3mf")
@ -356,15 +362,17 @@ class DFFileExportAndUploadManager:
"upload_progress" : -1,
"upload_status" : "",
"file_upload_response": None,
"file_upload_success_message": Message(
"file_upload_success_message": getBackwardsCompatibleMessage(
text = "'{}' was uploaded to '{}'.".format(filename_ufp, self._library_project_name),
title = "Upload successful",
lifetime = 0,
message_type_str = "POSITIVE"
),
"file_upload_failed_message": Message(
"file_upload_failed_message": getBackwardsCompatibleMessage(
text = "Failed to upload the file '{}' to '{}'.".format(filename_ufp, self._library_project_name),
title = "File upload error",
lifetime = 0
lifetime = 0,
message_type_str = "ERROR"
)
}
job_ufp = ExportFileJob(self._file_handlers["ufp"], self._nodes, self._file_name, "ufp")

View File

@ -23,6 +23,7 @@ from UM.TaskManagement.HttpRequestManager import HttpRequestManager
from cura.API import Account
from cura.CuraApplication import CuraApplication
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
from .BackwardsCompatibleMessage import getBackwardsCompatibleMessage
from .DFFileExportAndUploadManager import DFFileExportAndUploadManager
from .DigitalFactoryApiClient import DigitalFactoryApiClient
from .DigitalFactoryFileModel import DigitalFactoryFileModel
@ -527,10 +528,11 @@ class DigitalFactoryController(QObject):
except IOError as ex:
Logger.logException("e", "Can't write Digital Library file {0}/{1} download to temp-directory {2}.",
ex, project_name, file_name, temp_dir)
Message(
getBackwardsCompatibleMessage(
text = "Failed to write to temporary file for '{}'.".format(file_name),
title = "File-system error",
lifetime = 10
lifetime = 10,
message_type_str="ERROR"
).show()
return
@ -541,10 +543,11 @@ class DigitalFactoryController(QObject):
f = file_name) -> None:
progress_message.hide()
Logger.error("An error {0} {1} occurred while downloading {2}/{3}".format(str(error), str(reply), p, f))
Message(
getBackwardsCompatibleMessage(
text = "Failed Digital Library download for '{}'.".format(f),
title = "Network error {}".format(error),
lifetime = 10
lifetime = 10,
message_type_str="ERROR"
).show()
download_manager = HttpRequestManager.getInstance()
@ -589,7 +592,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()
getBackwardsCompatibleMessage(text = "Cannot upload file with an empty name to the Digital Library",
title = "Empty file name provided",
lifetime = 0,
message_type_str = "ERROR").show()
return
self._saveFileToSelectedProjectHelper(filename, formats)

View File

@ -112,7 +112,7 @@ class FirmwareUpdateCheckerJob(Job):
# The first time we want to store the current version, the notification will not be shown,
# because the new version of Cura will be release before the firmware and we don't want to
# notify the user when no new firmware version is available.
if (checked_version != "") and (checked_version != current_version):
if checked_version != "" and checked_version != current_version:
Logger.log("i", "Showing firmware update message for new version: {version}".format(version = current_version))
message = FirmwareUpdateCheckerMessage(machine_id, self._machine_name, current_version,
self._lookups.getRedirectUserUrl())

View File

@ -14,12 +14,12 @@ class FirmwareUpdateCheckerMessage(Message):
def __init__(self, machine_id: int, machine_name: str, latest_version: str, download_url: str) -> None:
super().__init__(i18n_catalog.i18nc(
"@info Don't translate {machine_name}, since it gets replaced by a printer name!",
"New features or bug-fixes may be available for your {machine_name}! If not already at the latest version, "
"New features or bug-fixes may be available for your {machine_name}! If you haven't done so already, "
"it is recommended to update the firmware on your printer to version {latest_version}.").format(
machine_name = machine_name, latest_version = latest_version),
title = i18n_catalog.i18nc(
"@info:title The %s gets replaced with the printer name.",
"New %s firmware available") % machine_name)
"New %s stable firmware available") % machine_name)
self._machine_id = machine_id
self._download_url = download_url

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

@ -491,7 +491,7 @@ class PauseAtHeight(Script):
# Move the head back
if current_z < 15:
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n"
prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + "\n"
prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n"
prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + " ; move back down to resume height\n"
if retraction_amount != 0:

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

@ -39,7 +39,7 @@ Rectangle
text: catalog.i18nc("@info:tooltip", "Go to Web Marketplace")
Label
{
text: "<a href='%2'>".arg(toolbox.getWebMarketplaceUrl("materials")) + catalog.i18nc("@label", "Search materials") + "</a>"
text: "<a href='%2'>".arg(toolbox.getWebMarketplaceUrl("materials") + "?utm_source=cura&utm_medium=software&utm_campaign=marketplace-search") + catalog.i18nc("@label", "Search materials") + "</a>"
width: contentWidth
height: contentHeight
horizontalAlignment: Text.AlignRight

View File

@ -91,7 +91,7 @@ Item
verticalCenter: parent.verticalCenter
}
acceptedButtons: Qt.LeftButton
onClicked: Qt.openUrlExternally(toolbox.getWebMarketplaceUrl("plugins"))
onClicked: Qt.openUrlExternally(toolbox.getWebMarketplaceUrl("plugins") + "?utm_source=cura&utm_medium=software&utm_campaign=marketplace-button")
UM.RecolorImage
{
id: cloudMarketplaceButton

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

@ -58,7 +58,6 @@ class PackagesModel(ListModel):
items = []
if self._metadata is None:
Logger.logException("w", "Failed to load packages for Marketplace")
self.setItems(items)
return

View File

@ -183,12 +183,15 @@ class Toolbox(QObject, Extension):
self._application.getCuraAPI().account.loginStateChanged.connect(self._restart)
preferences = CuraApplication.getInstance().getPreferences()
preferences.addPreference("info/automatic_plugin_update_check", True)
# On boot we check which packages have updates.
if CuraApplication.getInstance().getPreferences().getValue("info/automatic_update_check") and len(installed_package_ids_with_versions) > 0:
if preferences.getValue("info/automatic_plugin_update_check") and len(installed_package_ids_with_versions) > 0:
# Request the latest and greatest!
self._makeRequestByType("updates")
def _fetchPackageData(self) -> None:
self._makeRequestByType("packages")
self._makeRequestByType("authors")
@ -648,8 +651,11 @@ class Toolbox(QObject, Extension):
self.resetDownload()
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
Logger.log("w", "Failed to download package. The following error was returned: %s",
json.loads(reply.readAll().data().decode("utf-8")))
try:
reply_error = json.loads(reply.readAll().data().decode("utf-8"))
except Exception as e:
reply_error = str(e)
Logger.log("w", "Failed to download package. The following error was returned: %s", reply_error)
return
# Must not delete the temporary file on Windows
self._temp_plugin_file = tempfile.NamedTemporaryFile(mode = "w+b", suffix = ".curapackage", delete = False)

View File

@ -30,7 +30,7 @@ Button
horizontalCenter: parent.horizontalCenter
verticalCenter: parent.verticalCenter
}
color: UM.Theme.getColor("primary")
color: enabled ? UM.Theme.getColor("primary") : UM.Theme.getColor("main_background")
height: width
source: iconSource
width: Math.round(parent.width / 2)

View File

@ -173,7 +173,7 @@ Cura.MachineAction
anchors.right: parent.right
wrapMode: Text.WordWrap
renderType: Text.NativeRendering
text: catalog.i18nc("@label", "If your printer is not listed, read the <a href='%1'>network printing troubleshooting guide</a>").arg("https://support.ultimaker.com/hc/en-us/articles/360012795419");
text: catalog.i18nc("@label", "If your printer is not listed, read the <a href='%1'>network printing troubleshooting guide</a>").arg("https://ultimaker.com/en/cura/troubleshooting/network?utm_source=cura&utm_medium=software&utm_campaign=manage-network-printer");
onLinkActivated: Qt.openUrlExternally(link)
}

View File

@ -40,7 +40,6 @@ Item
width: 240 * screenScaleFactor // TODO: Theme!
color: UM.Theme.getColor("monitor_tooltip_text")
font: UM.Theme.getFont("default")
renderType: Text.NativeRendering
}
}
}

View File

@ -271,8 +271,8 @@ Item
}
// For cloud printing, add this mouse area over the disabled cameraButton to indicate that it's not available
//Warning message is commented out because it's factually incorrect. Fix CURA-7637 to allow camera connections via cloud.
/* MouseArea
// Fix CURA-7637 to allow camera connections via cloud.
MouseArea
{
id: cameraDisabledButtonArea
anchors.fill: cameraButton
@ -282,13 +282,13 @@ Item
enabled: !cameraButton.enabled
}
MonitorInfoBlurb
{
id: cameraDisabledInfo
text: catalog.i18nc("@info", "The webcam is not available because you are monitoring a cloud printer.")
text: catalog.i18nc("@info", "Webcam feeds for cloud printers cannot be viewed from Ultimaker Cura." +
" Click \"Manage printer\" to visit Ultimaker Digital Factory and view this webcam.")
target: cameraButton
}*/
}
}
// Divider

View File

@ -262,7 +262,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
icon="",
description=I18N_CATALOG.i18nc("@action:tooltip", "Track the print in Ultimaker Digital Factory"),
button_align=message.ActionButtonAlignment.ALIGN_RIGHT)
df_url = f"https://digitalfactory.ultimaker.com/app/jobs/{self._cluster.cluster_id}?utm_source=cura&utm_medium=software&utm_campaign=monitor-button"
df_url = f"https://digitalfactory.ultimaker.com/app/jobs/{self._cluster.cluster_id}?utm_source=cura&utm_medium=software&utm_campaign=message-printjob-sent"
message.pyQtActionTriggered.connect(lambda message, action: (QDesktopServices.openUrl(QUrl(df_url)), message.hide()))
message.show()
@ -334,11 +334,11 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
@pyqtSlot(name="openPrintJobControlPanel")
def openPrintJobControlPanel(self) -> None:
QDesktopServices.openUrl(QUrl(self.clusterCloudUrl))
QDesktopServices.openUrl(QUrl(self.clusterCloudUrl + "?utm_source=cura&utm_medium=software&utm_campaign=monitor-manage-browser"))
@pyqtSlot(name="openPrinterControlPanel")
def openPrinterControlPanel(self) -> None:
QDesktopServices.openUrl(QUrl(self.clusterCloudUrl))
QDesktopServices.openUrl(QUrl(self.clusterCloudUrl + "?utm_source=cura&utm_medium=software&utm_campaign=monitor-manage-printer"))
@property
def clusterData(self) -> CloudClusterResponse:
@ -357,4 +357,4 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
"""Gets the URL on which to monitor the cluster via the cloud."""
root_url_prefix = "-staging" if self._account.is_staging else ""
return "https://mycloud{}.ultimaker.com/app/jobs/{}".format(root_url_prefix, self.clusterData.cluster_id)
return "https://digitalfactory{}.ultimaker.com/app/jobs/{}".format(root_url_prefix, self.clusterData.cluster_id)

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(
@ -330,7 +332,7 @@ class CloudOutputDeviceManager:
message_text += self.i18n_catalog.i18nc(
"info:status",
"To establish a connection, please visit the {website_link}".format(website_link = "<a href='https://digitalfactory.ultimaker.com/'>{}</a>.".format(digital_factory_string))
"To establish a connection, please visit the {website_link}".format(website_link = "<a href='https://digitalfactory.ultimaker.com?utm_source=cura&utm_medium=software&utm_campaign=change-account-connect-printer'>{}</a>.".format(digital_factory_string))
)
self._removed_printers_message.setText(message_text)
self._removed_printers_message.addAction("keep_printer_configurations_action",
@ -417,7 +419,7 @@ class CloudOutputDeviceManager:
machine.setMetaDataEntry("group_name", device.name)
machine.setMetaDataEntry("group_size", device.clusterSize)
digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory")
digital_factory_link = "<a href='https://digitalfactory.ultimaker.com/'>{digital_factory_string}</a>".format(digital_factory_string = digital_factory_string)
digital_factory_link = "<a href='https://digitalfactory.ultimaker.com?utm_source=cura&utm_medium=software&utm_campaign=change-account-remove-printer'>{digital_factory_string}</a>".format(digital_factory_string = digital_factory_string)
removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \
+ "<br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \
+ "<br><br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name)

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

@ -44,7 +44,7 @@
"material_diameter": { "default_value": 1.75 },
"acceleration_print": { "value": 1800 },
"acceleration_print": { "value": 1500 },
"acceleration_travel": { "value": 3000 },
"acceleration_travel_layer_0": { "value": "acceleration_travel" },
"acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },

View File

@ -12,6 +12,9 @@
"machine_name": { "default_value": "Anycubic i3 Mega X" },
"machine_width": { "default_value": 300 },
"machine_height": { "default_value": 305 },
"machine_depth": { "default_value": 300 }
"machine_depth": { "default_value": 300 },
"acceleration_print": { "value": 400 },
"acceleration_travel": { "value": 400 }
}
}

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,44 @@
{
"version": 2,
"name": "Crazy3DPrint CZ-300",
"inherits": "fdmprinter",
"metadata": {
"visible": false,
"author": "XYZprinting Software",
"manufacturer": "Crazy3DPrint",
"file_formats": "text/x-gcode",
"first_start_actions": ["MachineSettingsAction"],
"machine_extruder_trains":
{
"0": "crazy3dprint_cz300_extruder_0"
},
"has_materials": true,
"has_variants": true,
"has_machine_quality": true,
"preferred_variant_name": "0.4mm Nozzle",
"preferred_quality_type": "normal",
"preferred_material": "generic_pla",
"variants_name": "Nozzle Size"
},
"overrides": {
"machine_heated_bed": {"default_value": true},
"machine_max_feedrate_x": { "value": 500 },
"machine_max_feedrate_y": { "value": 500 },
"machine_max_feedrate_z": { "value": 10 },
"machine_max_feedrate_e": { "value": 50 },
"machine_max_acceleration_x": { "value": 1500 },
"machine_max_acceleration_y": { "value": 1500 },
"machine_max_acceleration_z": { "value": 500 },
"machine_max_acceleration_e": { "value": 5000 },
"machine_acceleration": { "value": 500 },
"machine_max_jerk_xy": { "value": 10 },
"machine_max_jerk_z": { "value": 0.4 },
"machine_max_jerk_e": { "value": 5 }
},
"machine_gcode_flavor": {"default_value": "RepRap (Marlin/Sprinter)"},
"machine_start_gcode": {"default_value": ";Start Gcode\nG90 ;absolute positioning\nM118 X25.00 Y25.00 Z20.00 T0\nM140 S{material_bed_temperature_layer_0} T0 ;Heat bed up to first layer temperature\nM104 S{material_print_temperature_layer_0} T0 ;Set nozzle temperature to first layer temperature\nM107 ;start with the fan off\nG90\nG28\nM132 X Y Z A B\nG1 Z50.000 F420\nG161 X Y F3300\nM7 T0\nM6 T0\nM651\nM907 X100 Y100 Z40 A100 B20 ;Digital potentiometer value\nM108 T0\n;Purge line\nG1 X-110.00 Y-60.00 F4800\nG1 Z{layer_height_0} F420\nG1 X-110.00 Y60.00 E17,4 F1200\n;Purge line end"},
"machine_end_gcode": {"default_value": ";end gcode\nM104 S0 T0\nM140 S0 T0\nG162 Z F1800\nG28 X Y\nM652\nM132 X Y Z A B\nG91\nM18"
}
}

View File

@ -0,0 +1,65 @@
{
"version": 2,
"name": "Crazy3DPrint CZ-300",
"inherits": "crazy3dprint_base",
"metadata": {
"visible": true,
"author": "XYZprinting Software",
"manufacturer": "Crazy3DPrint",
"file_formats": "text/x-gcode",
"supports_usb_connection": true,
"preferred_quality_type": "normal",
"quality_definition": "crazy3dprint_base"
},
"overrides": {
"machine_name": { "default_value": "CZ-300" },
"machine_shape": { "default_value": "rectangular"},
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 300.00 },
"machine_depth": { "default_value": 300.00 },
"machine_height": { "default_value":300.00 },
"machine_center_is_zero": { "default_value": false },
"machine_head_with_fans_polygon": {
"default_value": [
[ -20, -10 ],
[ -20, 10 ],
[ 10, 10 ],
[ 10, -10 ]
]
},
"layer_height": { "default_value": 0.2 },
"infill_sparse_density": { "default_value": 15 },
"infill_line_distance": { "value": 2.6667 },
"infill_pattern": { "value": "'lines'" },
"infill_overlap": { "value": 8.0 },
"min_infill_area": { "default_value": 2.0 },
"retract_at_layer_change": { "default_value": true },
"default_material_print_temperature": { "default_value": 210 },
"material_print_temperature": { "value": 210 },
"material_final_print_temperature": { "value": 210 },
"material_bed_temperature": { "value": 70 },
"material_bed_temperature_layer_0": { "value": 70 },
"material_flow_layer_0": {"value": 140},
"retraction_amount": { "default_value": 10 },
"retraction_speed": { "default_value": 70 },
"speed_print": { "default_value": 40 },
"speed_travel": { "value": 60 },
"cool_fan_enabled": { "default_value": true },
"cool_fan_speed_0": { "value": 100 },
"adhesion_type": { "default_value" : "skirt" },
"brim_line_count": { "value" : 5 },
"skirt_line_count": { "default_value" : 5 },
"initial_layer_line_width_factor": { "default_value" : 140 },
"top_bottom_pattern": { "default_value" : "concentric" },
"outer_inset_first": { "default_value": true },
"fill_outline_gaps": { "default_value": true },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "G28 ; home all axes\nG1 Z15 F5000 ; lift nozzle\nG92 E0\nG1 F200 E3\n"
},
"machine_end_gcode": {
"default_value": "M104 S0 ; turn off temperature\nM105 S0; \nG28 X0 ; home X axis\nM84 ; disable motors\n"
}
}
}

View File

@ -1519,6 +1519,16 @@
"limit_to_extruder": "top_bottom_extruder_nr",
"settable_per_mesh": true
},
"skin_monotonic":
{
"label": "Monotonic Top/Bottom Order",
"description": "Print top/bottom lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent.",
"type": "bool",
"default_value": false,
"enabled": "(top_layers > 0 or bottom_layers > 0) and (top_bottom_pattern != 'concentric' or top_bottom_pattern_0 != 'concentric')",
"limit_to_extruder": "top_bottom_extruder_nr",
"settable_per_mesh": true
},
"skin_angles":
{
"label": "Top/Bottom Line Directions",
@ -1586,6 +1596,16 @@
"limit_to_extruder": "top_bottom_extruder_nr",
"settable_per_mesh": true
},
"ironing_monotonic":
{
"label": "Monotonic Ironing Order",
"description": "Print ironing lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent.",
"type": "bool",
"default_value": false,
"enabled": "ironing_enabled and ironing_pattern != 'concentric'",
"limit_to_extruder": "top_bottom_extruder_nr",
"settable_per_mesh": true
},
"ironing_line_spacing":
{
"label": "Ironing Line Spacing",
@ -6385,6 +6405,17 @@
"settable_per_mesh": true,
"enabled": "roofing_layer_count > 0 and top_layers > 0"
},
"roofing_monotonic":
{
"label": "Monotonic Top Surface Order",
"description": "Print top surface lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent.",
"type": "bool",
"default_value": false,
"value": "skin_monotonic",
"enabled": "roofing_layer_count > 0 and top_layers > 0 and roofing_pattern != 'concentric'",
"limit_to_extruder": "roofing_extruder_nr",
"settable_per_mesh": true
},
"roofing_angles":
{
"label": "Top Surface Skin Line Directions",

View File

@ -0,0 +1,141 @@
{
"name": "Goofoo Base Printer",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": false,
"author": "goofoo3d.com",
"manufacturer": "GooFoo",
"file_formats": "text/x-gcode",
"first_start_actions": ["MachineSettingsAction"],
"machine_extruder_trains": {
"0": "goofoo_base_extruder"
},
"has_materials": true,
"preferred_material": "goofoo_pla",
"has_variants": true,
"variants_name": "Nozzle Size",
"preferred_variant_name": "0.4mm Nozzle",
"has_machine_quality": true,
"preferred_quality_type": "normal"
},
"overrides": {
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract the filament\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG28 X0 Y0 ;Home X and Y\n\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z" },
"machine_max_feedrate_x": { "value": 500 },
"machine_max_feedrate_y": { "value": 500 },
"machine_max_feedrate_z": { "value": 10 },
"machine_max_feedrate_e": { "value": 50 },
"machine_max_acceleration_x": { "value": 500 },
"machine_max_acceleration_y": { "value": 500 },
"machine_max_acceleration_z": { "value": 100 },
"machine_max_acceleration_e": { "value": 5000 },
"machine_acceleration": { "value": 500 },
"machine_max_jerk_xy": { "value": 10 },
"machine_max_jerk_z": { "value": 0.4 },
"machine_max_jerk_e": { "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 },
"speed_print": { "value": 40.0 } ,
"speed_infill": { "value": "speed_print" },
"speed_wall": { "value": "speed_print" },
"speed_wall_0": { "value": "speed_wall" },
"speed_wall_x": { "value": "speed_wall" },
"speed_topbottom": { "value": "speed_print" },
"speed_roofing": { "value": "speed_topbottom" },
"speed_travel": { "value": "80" },
"speed_layer_0": { "value": 20.0 },
"speed_print_layer_0": { "value": "speed_layer_0" },
"speed_travel_layer_0": { "value": "60" },
"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" },
"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_weighted'" },
"infill_sparse_density": { "value": "20" },
"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": "False" },
"retraction_hop": { "value": 0.2 },
"retraction_combing": { "value": "'off' if retraction_hop_enabled else 'noskin'" },
"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_enable": { "value": true },
"retraction_count_max": { "value": 100 },
"retraction_extrusion_window": { "value": 10 },
"retraction_min_travel": { "value": 1.5 },
"cool_fan_full_at_height": { "value": "3 * layer_height" },
"cool_fan_enabled": { "value": true },
"cool_min_layer_time": { "value": 10 },
"top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" },
"wall_thickness": {"value": "line_width * 2" }
}
}

View File

@ -0,0 +1,29 @@
{
"name": "Goofoo E-one",
"version": 2,
"inherits": "goofoo_open",
"overrides": {
"machine_name": { "default_value": "Goofoo E-one" },
"machine_width": { "default_value": 300 },
"machine_depth": { "default_value": 300 },
"machine_height": { "default_value": 400 }
},
"metadata": {
"visible": true,
"exclude_materials": [
"goofoo_bronze_pla",
"goofoo_peek",
"goofoo_tpe_83a",
"goofoo_tpu_87a",
"goofoo_tpu_95a",
"goofoo_pa_cf",
"goofoo_pc",
"goofoo_pa",
"goofoo_asa",
"goofoo_abs",
"goofoo_pva",
"goofoo_hips",
"goofoo_pva"
]
}
}

View File

@ -0,0 +1,15 @@
{
"name": "Goofoo Far",
"version": 2,
"inherits": "goofoo_base",
"metadata": {
"quality_definition": "goofoo_far",
"visible": false,
"exclude_materials": [
"goofoo_bronze_pla",
"goofoo_tpe_83a",
"goofoo_tpu_87a",
"goofoo_tpu_95a"
]
}
}

View File

@ -0,0 +1,22 @@
{
"name": "Goofoo Gemini",
"version": 2,
"inherits": "goofoo_far",
"overrides": {
"machine_name": { "default_value": "Goofoo Gemini" },
"machine_width": { "default_value": 360 },
"machine_depth": { "default_value": 250 },
"machine_height": { "default_value": 200 },
"machine_head_with_fans_polygon":{"default_value":[[0, 0], [0, 0], [0, 0], [0, 0]]},
"machine_extruder_count": {
"default_value": 2
}
},
"metadata": {
"machine_extruder_trains": {
"0": "goofoo_gemini_1st",
"1": "goofoo_gemini_2st"
},
"visible": true
}
}

View File

@ -0,0 +1,15 @@
{
"name": "Goofoo Giant",
"version": 2,
"inherits": "goofoo_near",
"overrides": {
"machine_name": { "default_value": "Goofoo Giant" },
"machine_width": { "default_value": 600 },
"machine_depth": { "default_value": 600 },
"machine_height": { "default_value": 1000 }
},
"metadata": {
"visible": true
}
}

View File

@ -0,0 +1,24 @@
{
"name": "Goofoo Max",
"version": 2,
"inherits": "goofoo_near",
"overrides": {
"machine_name": { "default_value": "Goofoo Max" },
"machine_width": { "default_value": 600 },
"machine_depth": { "default_value": 580 },
"machine_height": { "default_value": 700 },
"machine_head_with_fans_polygon": { "default_value": [
[0, 0],
[0, 0],
[0, 0],
[0, 0]
]
},
"gantry_height": { "value": 0 }
},
"metadata": {
"visible": true
}
}

View File

@ -0,0 +1,15 @@
{
"name": "Goofoo Mido",
"version": 2,
"inherits": "goofoo_near",
"overrides": {
"machine_name": { "default_value": "Goofoo Mido" },
"machine_width": { "default_value": 200 },
"machine_depth": { "default_value": 200 },
"machine_height": { "default_value": 200 }
},
"metadata": {
"visible": true
}
}

View File

@ -0,0 +1,15 @@
{
"name": "Goofoo Mini+",
"version": 2,
"inherits": "goofoo_near",
"overrides": {
"machine_name": { "default_value": "Goofoo Mini+" },
"machine_width": { "default_value": 200 },
"machine_depth": { "default_value": 200 },
"machine_height": { "default_value": 150 }
},
"metadata": {
"visible": true
}
}

View File

@ -0,0 +1,9 @@
{
"name": "Goofoo Near",
"version": 2,
"inherits": "goofoo_base",
"metadata": {
"quality_definition": "goofoo_near",
"visible": false
}
}

View File

@ -0,0 +1,16 @@
{
"name": "Goofoo Nova",
"version": 2,
"inherits": "goofoo_near",
"overrides": {
"machine_name": { "default_value": "Goofoo Nova" },
"machine_width": { "default_value": 280 },
"machine_depth": { "default_value": 280 },
"machine_height": { "default_value": 300 }
},
"metadata": {
"author": "goofoo",
"visible": true
}
}

View File

@ -0,0 +1,21 @@
{
"name": "Goofoo Open",
"version": 2,
"inherits": "goofoo_base",
"metadata": {
"quality_definition": "goofoo_open",
"visible": false,
"exclude_materials": [
"goofoo_bronze_pla",
"goofoo_peek",
"goofoo_tpe_83a",
"goofoo_tpu_87a",
"goofoo_tpu_95a",
"goofoo_pa_cf",
"goofoo_pc",
"goofoo_pa",
"goofoo_asa",
"goofoo_abs"
]
}
}

View File

@ -0,0 +1,15 @@
{
"name": "Goofoo Plus",
"version": 2,
"inherits": "goofoo_near",
"overrides": {
"machine_name": { "default_value": "Goofoo Plus" },
"machine_width": { "default_value": 360 },
"machine_depth": { "default_value": 360 },
"machine_height": { "default_value": 400 }
},
"metadata": {
"visible": true
}
}

View File

@ -0,0 +1,23 @@
{
"name": "Goofoo Small",
"version": 2,
"inherits": "goofoo_base",
"metadata": {
"quality_definition": "goofoo_small",
"visible": false,
"exclude_materials": [
"goofoo_bronze_pla",
"goofoo_peek",
"goofoo_tpe_83a",
"goofoo_tpu_87a",
"goofoo_tpu_95a",
"goofoo_pa_cf",
"goofoo_pc",
"goofoo_pa",
"goofoo_asa",
"goofoo_abs",
"goofoo_pva",
"goofoo_hips"
]
}
}

View File

@ -0,0 +1,36 @@
{
"name": "Goofoo T-one",
"version": 2,
"inherits": "goofoo_far",
"overrides": {
"machine_name": { "default_value": "Goofoo T-one" },
"machine_width": { "default_value": 200 },
"machine_depth": { "default_value": 200 },
"machine_height": { "default_value": 150 },
"machine_extruder_count": {
"default_value": 2
}
},
"metadata": {
"machine_extruder_trains": {
"0": "goofoo_tone_1st",
"1": "goofoo_tone_2st"
},
"exclude_materials": [
"goofoo_bronze_pla",
"goofoo_peek",
"goofoo_tpe_83a",
"goofoo_tpu_87a",
"goofoo_tpu_95a",
"goofoo_pa_cf",
"goofoo_pc",
"goofoo_pa",
"goofoo_asa",
"goofoo_abs",
"goofoo_pva",
"goofoo_hips",
"goofoo_pva"
],
"visible": true
}
}

View File

@ -0,0 +1,16 @@
{
"name": "Goofoo Tiny",
"version": 2,
"inherits": "goofoo_small",
"overrides": {
"machine_name": { "default_value": "Goofoo Tiny" },
"machine_width": { "default_value": 100 },
"machine_depth": { "default_value": 100 },
"machine_height": { "default_value": 100 },
"machine_heated_bed": { "default_value": false },
"raft_margin": { "default_value": 5 }
},
"metadata": {
"visible": true
}
}

View File

@ -0,0 +1,16 @@
{
"name": "Goofoo Tiny+",
"version": 2,
"inherits": "goofoo_small",
"overrides": {
"machine_name": { "default_value": "Goofoo Tiny+" },
"machine_width": { "default_value": 120 },
"machine_depth": { "default_value": 120 },
"machine_height": { "default_value": 180 },
"raft_margin": { "default_value": 5 },
"machine_heated_bed": { "default_value": false }
},
"metadata": {
"visible": true
}
}

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

@ -0,0 +1,17 @@
{
"name": "Renkforce Basic 3",
"version": 2,
"inherits": "goofoo_small",
"overrides": {
"machine_name": { "default_value": "Renkforce Basic 3" },
"machine_width": { "default_value": 120 },
"machine_depth": { "default_value": 120 },
"machine_height": { "default_value": 180 },
"machine_heated_bed": { "default_value": false }
},
"metadata": {
"author": "Simon Peter (based on RF100.ini by Conrad Electronic SE)",
"manufacturer": "Renkforce",
"visible": true
}
}

View File

@ -0,0 +1,17 @@
{
"name": "Renkforce Pro 3",
"version": 2,
"inherits": "goofoo_near",
"overrides": {
"machine_name": { "default_value": "Renkforce Pro 3" },
"machine_width": { "default_value": 200 },
"machine_depth": { "default_value": 200 },
"machine_height": { "default_value": 150 }
},
"metadata": {
"author": "Simon Peter (based on RF100.ini by Conrad Electronic SE)",
"manufacturer": "Renkforce",
"visible": true
}
}

View File

@ -0,0 +1,17 @@
{
"name": "Renkforce Pro 6",
"version": 2,
"inherits": "goofoo_near",
"overrides": {
"machine_name": { "default_value": "Renkforce Pro 6" },
"machine_width": { "default_value": 200 },
"machine_depth": { "default_value": 200 },
"machine_height": { "default_value": 200 }
},
"metadata": {
"author": "Simon Peter (based on RF100.ini by Conrad Electronic SE)",
"manufacturer": "Renkforce",
"visible": 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

@ -22,8 +22,7 @@
"0": "ultimaker2_plus_connect_extruder_0"
},
"supports_usb_connection": false,
"supports_network_connection": true,
"supports_material_export": true
"supports_network_connection": true
},
"overrides": {

View File

@ -32,7 +32,7 @@
[
"https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version"
],
"update_url": "https://ultimaker.com/firmware"
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
},
"bom_numbers": [
9066

View File

@ -29,7 +29,7 @@
[
"https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version"
],
"update_url": "https://ultimaker.com/firmware"
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
},
"bom_numbers": [
9511

View File

@ -32,7 +32,7 @@
"firmware_update_info": {
"id": 213482,
"check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"],
"update_url": "https://ultimaker.com/firmware"
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
},
"bom_numbers": [
213482

View File

@ -33,7 +33,7 @@
"firmware_update_info": {
"id": 9051,
"check_urls": ["https://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version"],
"update_url": "https://ultimaker.com/firmware"
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
},
"bom_numbers": [
9051, 214475

View File

@ -0,0 +1,15 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "crazy3dprint_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,16 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "goofoo_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,19 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "goofoo_gemini",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

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

View File

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

View File

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

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 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 }
}
}

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