mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-13 00:28:59 +08:00
Merge branch 'master' into feature_extruder_warning_icon
This commit is contained in:
commit
96a1019f1e
11
CITATION.cff
Normal file
11
CITATION.cff
Normal 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"
|
||||
...
|
@ -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&utm_medium=software&utm_campaign=resources</url>
|
||||
<url type="homepage">https://ultimaker.com/software/ultimaker-cura?utm_source=cura&utm_medium=software&utm_campaign=cura-update-linux</url>
|
||||
<translation type="gettext">Cura</translation>
|
||||
</component>
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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]
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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"))
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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 [], {}
|
||||
|
@ -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()
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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.
|
||||
}
|
||||
}
|
||||
|
15
plugins/DigitalLibrary/src/BackwardsCompatibleMessage.py
Normal file
15
plugins/DigitalLibrary/src/BackwardsCompatibleMessage.py
Normal 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)
|
@ -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")
|
||||
|
@ -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)
|
||||
|
@ -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())
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
11
plugins/README_plugins.txt
Normal file
11
plugins/README_plugins.txt
Normal 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.
|
@ -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()
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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"), "", "")
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
11
resources/README_resources.txt
Normal file
11
resources/README_resources.txt
Normal 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
|
@ -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" },
|
||||
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
@ -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 }
|
||||
|
44
resources/definitions/crazy3dprint_base.def.json
Normal file
44
resources/definitions/crazy3dprint_base.def.json
Normal 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"
|
||||
}
|
||||
}
|
65
resources/definitions/crazy3dprint_cz_300.def.json
Normal file
65
resources/definitions/crazy3dprint_cz_300.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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",
|
||||
|
141
resources/definitions/goofoo_base.def.json
Normal file
141
resources/definitions/goofoo_base.def.json
Normal 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" }
|
||||
|
||||
}
|
||||
}
|
29
resources/definitions/goofoo_e-one.def.json
Normal file
29
resources/definitions/goofoo_e-one.def.json
Normal 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"
|
||||
]
|
||||
}
|
||||
}
|
15
resources/definitions/goofoo_far.def.json
Normal file
15
resources/definitions/goofoo_far.def.json
Normal 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"
|
||||
]
|
||||
}
|
||||
}
|
22
resources/definitions/goofoo_gemini.def.json
Normal file
22
resources/definitions/goofoo_gemini.def.json
Normal 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
|
||||
}
|
||||
}
|
15
resources/definitions/goofoo_giant.def.json
Normal file
15
resources/definitions/goofoo_giant.def.json
Normal 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
|
||||
}
|
||||
}
|
24
resources/definitions/goofoo_max.def.json
Normal file
24
resources/definitions/goofoo_max.def.json
Normal 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
|
||||
}
|
||||
}
|
15
resources/definitions/goofoo_mido.def.json
Normal file
15
resources/definitions/goofoo_mido.def.json
Normal 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
|
||||
}
|
||||
}
|
15
resources/definitions/goofoo_miniplus.def.json
Normal file
15
resources/definitions/goofoo_miniplus.def.json
Normal 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
|
||||
}
|
||||
}
|
9
resources/definitions/goofoo_near.def.json
Normal file
9
resources/definitions/goofoo_near.def.json
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "Goofoo Near",
|
||||
"version": 2,
|
||||
"inherits": "goofoo_base",
|
||||
"metadata": {
|
||||
"quality_definition": "goofoo_near",
|
||||
"visible": false
|
||||
}
|
||||
}
|
16
resources/definitions/goofoo_nova.def.json
Normal file
16
resources/definitions/goofoo_nova.def.json
Normal 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
|
||||
}
|
||||
}
|
21
resources/definitions/goofoo_open.def.json
Normal file
21
resources/definitions/goofoo_open.def.json
Normal 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"
|
||||
]
|
||||
}
|
||||
}
|
15
resources/definitions/goofoo_plus.def.json
Normal file
15
resources/definitions/goofoo_plus.def.json
Normal 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
|
||||
}
|
||||
}
|
23
resources/definitions/goofoo_small.def.json
Normal file
23
resources/definitions/goofoo_small.def.json
Normal 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"
|
||||
]
|
||||
}
|
||||
}
|
36
resources/definitions/goofoo_t-one.def.json
Normal file
36
resources/definitions/goofoo_t-one.def.json
Normal 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
|
||||
}
|
||||
}
|
16
resources/definitions/goofoo_tiny.def.json
Normal file
16
resources/definitions/goofoo_tiny.def.json
Normal 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
|
||||
}
|
||||
}
|
16
resources/definitions/goofoo_tinyplus.def.json
Normal file
16
resources/definitions/goofoo_tinyplus.def.json
Normal 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
|
||||
}
|
||||
}
|
279
resources/definitions/kingroon_base.def.json
Normal file
279
resources/definitions/kingroon_base.def.json
Normal 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" }
|
||||
|
||||
}
|
||||
}
|
22
resources/definitions/kingroon_kp3.def.json
Normal file
22
resources/definitions/kingroon_kp3.def.json
Normal 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"
|
||||
}
|
||||
}
|
33
resources/definitions/kingroon_kp3s.def.json
Normal file
33
resources/definitions/kingroon_kp3s.def.json
Normal 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"
|
||||
}
|
||||
}
|
17
resources/definitions/renkforce_basic3.def.json
Normal file
17
resources/definitions/renkforce_basic3.def.json
Normal 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
|
||||
}
|
||||
}
|
17
resources/definitions/renkforce_pro3.def.json
Normal file
17
resources/definitions/renkforce_pro3.def.json
Normal 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
|
||||
}
|
||||
}
|
17
resources/definitions/renkforce_pro6.def.json
Normal file
17
resources/definitions/renkforce_pro6.def.json
Normal 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
|
||||
}
|
||||
}
|
59
resources/definitions/seckit_skgo.def.json
Normal file
59
resources/definitions/seckit_skgo.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
59
resources/definitions/seckit_sktank.def.json
Normal file
59
resources/definitions/seckit_sktank.def.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
@ -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": {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
15
resources/extruders/crazy3dprint_cz300_extruder_0.def.json
Normal file
15
resources/extruders/crazy3dprint_cz300_extruder_0.def.json
Normal 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 }
|
||||
}
|
||||
}
|
16
resources/extruders/goofoo_base_extruder.def.json
Normal file
16
resources/extruders/goofoo_base_extruder.def.json
Normal 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 }
|
||||
|
||||
}
|
||||
}
|
19
resources/extruders/goofoo_gemini_1st.def.json
Normal file
19
resources/extruders/goofoo_gemini_1st.def.json
Normal 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 }
|
||||
|
||||
}
|
||||
}
|
19
resources/extruders/goofoo_gemini_2st.def.json
Normal file
19
resources/extruders/goofoo_gemini_2st.def.json
Normal 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 }
|
||||
|
||||
}
|
||||
}
|
19
resources/extruders/goofoo_tone_1st.def.json
Normal file
19
resources/extruders/goofoo_tone_1st.def.json
Normal 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 }
|
||||
|
||||
}
|
||||
}
|
19
resources/extruders/goofoo_tone_2st.def.json
Normal file
19
resources/extruders/goofoo_tone_2st.def.json
Normal 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 }
|
||||
|
||||
}
|
||||
}
|
16
resources/extruders/kingroon_base_extruder_0.def.json
Normal file
16
resources/extruders/kingroon_base_extruder_0.def.json
Normal 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 }
|
||||
|
||||
}
|
||||
}
|
15
resources/extruders/seckit_skgo_extruder_0.def.json
Normal file
15
resources/extruders/seckit_skgo_extruder_0.def.json
Normal 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 }
|
||||
}
|
||||
}
|
15
resources/extruders/seckit_sktank_extruder_0.def.json
Normal file
15
resources/extruders/seckit_sktank_extruder_0.def.json
Normal 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
Loading…
x
Reference in New Issue
Block a user