diff --git a/cura/API/Account.py b/cura/API/Account.py index 0e3af0e6c1..4391f730e5 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -4,12 +4,11 @@ from typing import Optional, Dict, TYPE_CHECKING from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, pyqtProperty -from UM.i18n import i18nCatalog from UM.Message import Message -from cura import UltimakerCloudAuthentication - +from UM.i18n import i18nCatalog from cura.OAuth2.AuthorizationService import AuthorizationService from cura.OAuth2.Models import OAuth2Settings +from cura.UltimakerCloud import UltimakerCloudAuthentication if TYPE_CHECKING: from cura.CuraApplication import CuraApplication diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7b17583f68..e58e03bf67 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -7,71 +7,52 @@ import time from typing import cast, TYPE_CHECKING, Optional, Callable, List, Any import numpy - from PyQt5.QtCore import QObject, QTimer, QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from PyQt5.QtGui import QColor, QIcon -from PyQt5.QtWidgets import QMessageBox from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType, qmlRegisterType +from PyQt5.QtWidgets import QMessageBox -from UM.i18n import i18nCatalog +import UM.Util +import cura.Settings.cura_empty_instance_containers from UM.Application import Application from UM.Decorators import override from UM.FlameProfiler import pyqtSlot from UM.Logger import Logger -from UM.Message import Message -from UM.Platform import Platform -from UM.PluginError import PluginNotFoundError -from UM.Resources import Resources -from UM.Preferences import Preferences -from UM.Qt.QtApplication import QtApplication # The class we're inheriting from. -import UM.Util -from UM.View.SelectionPass import SelectionPass # For typing. - from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Math.Matrix import Matrix from UM.Math.Quaternion import Quaternion from UM.Math.Vector import Vector - from UM.Mesh.ReadMeshJob import ReadMeshJob - +from UM.Message import Message from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation - +from UM.Platform import Platform +from UM.PluginError import PluginNotFoundError +from UM.Preferences import Preferences +from UM.Qt.QtApplication import QtApplication # The class we're inheriting from. +from UM.Resources import Resources from UM.Scene.Camera import Camera from UM.Scene.GroupDecorator import GroupDecorator from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.Scene.ToolHandle import ToolHandle - from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType from UM.Settings.SettingFunction import SettingFunction from UM.Settings.Validator import Validator - +from UM.View.SelectionPass import SelectionPass # For typing. from UM.Workspace.WorkspaceReader import WorkspaceReader - +from UM.i18n import i18nCatalog +from cura import ApplicationMetadata from cura.API import CuraAPI - from cura.Arranging.Arrange import Arrange -from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob +from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob from cura.Arranging.ShapeArray import ShapeArray - -from cura.Operations.SetParentOperation import SetParentOperation - -from cura.Scene.BlockSlicingDecorator import BlockSlicingDecorator -from cura.Scene.BuildPlateDecorator import BuildPlateDecorator -from cura.Scene.ConvexHullDecorator import ConvexHullDecorator -from cura.Scene.CuraSceneController import CuraSceneController -from cura.Scene.CuraSceneNode import CuraSceneNode - -from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator -from cura.Scene import ZOffsetDecorator from cura.Machines.MachineErrorChecker import MachineErrorChecker - from cura.Machines.Models.BuildPlateModel import BuildPlateModel from cura.Machines.Models.CustomQualityProfilesDropDownMenuModel import CustomQualityProfilesDropDownMenuModel from cura.Machines.Models.DiscoveredPrintersModel import DiscoveredPrintersModel @@ -80,6 +61,8 @@ from cura.Machines.Models.FavoriteMaterialsModel import FavoriteMaterialsModel from cura.Machines.Models.FirstStartMachineActionsModel import FirstStartMachineActionsModel from cura.Machines.Models.GenericMaterialsModel import GenericMaterialsModel from cura.Machines.Models.GlobalStacksModel import GlobalStacksModel +from cura.Machines.Models.IntentCategoryModel import IntentCategoryModel +from cura.Machines.Models.IntentModel import IntentModel from cura.Machines.Models.MaterialBrandsModel import MaterialBrandsModel from cura.Machines.Models.MaterialManagementModel import MaterialManagementModel from cura.Machines.Models.MultiBuildPlateModel import MultiBuildPlateModel @@ -89,51 +72,47 @@ from cura.Machines.Models.QualityProfilesDropDownMenuModel import QualityProfile from cura.Machines.Models.QualitySettingsModel import QualitySettingsModel from cura.Machines.Models.SettingVisibilityPresetsModel import SettingVisibilityPresetsModel from cura.Machines.Models.UserChangesModel import UserChangesModel -from cura.Machines.Models.IntentModel import IntentModel -from cura.Machines.Models.IntentCategoryModel import IntentCategoryModel - -from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice +from cura.Operations.SetParentOperation import SetParentOperation from cura.PrinterOutput.NetworkMJPGImage import NetworkMJPGImage - -import cura.Settings.cura_empty_instance_containers +from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice +from cura.Scene import ZOffsetDecorator +from cura.Scene.BlockSlicingDecorator import BlockSlicingDecorator +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator +from cura.Scene.ConvexHullDecorator import ConvexHullDecorator +from cura.Scene.CuraSceneController import CuraSceneController +from cura.Scene.CuraSceneNode import CuraSceneNode +from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator from cura.Settings.ContainerManager import ContainerManager from cura.Settings.CuraContainerRegistry import CuraContainerRegistry from cura.Settings.CuraFormulaFunctions import CuraFormulaFunctions from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.ExtruderStack import ExtruderStack +from cura.Settings.GlobalStack import GlobalStack +from cura.Settings.IntentManager import IntentManager from cura.Settings.MachineManager import MachineManager from cura.Settings.MachineNameValidator import MachineNameValidator -from cura.Settings.IntentManager import IntentManager from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.SidebarCustomMenuItemsModel import SidebarCustomMenuItemsModel from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager - from cura.TaskManagement.OnExitCallbackManager import OnExitCallbackManager - from cura.UI import CuraSplashScreen, MachineActionManager, PrintInformation +from cura.UI.AddPrinterPagesModel import AddPrinterPagesModel from cura.UI.MachineSettingsManager import MachineSettingsManager from cura.UI.ObjectsModel import ObjectsModel -from cura.UI.TextManager import TextManager -from cura.UI.AddPrinterPagesModel import AddPrinterPagesModel from cura.UI.RecommendedMode import RecommendedMode +from cura.UI.TextManager import TextManager from cura.UI.WelcomePagesModel import WelcomePagesModel from cura.UI.WhatsNewPagesModel import WhatsNewPagesModel - +from cura.UltimakerCloud import UltimakerCloudAuthentication from cura.Utils.NetworkingUtil import NetworkingUtil - -from .SingleInstance import SingleInstance -from .AutoSave import AutoSave -from . import PlatformPhysics from . import BuildVolume from . import CameraAnimation from . import CuraActions +from . import PlatformPhysics from . import PrintJobPreviewImageProvider - -from cura.TaskManagement.OnExitCallbackManager import OnExitCallbackManager - -from cura import ApplicationMetadata, UltimakerCloudAuthentication -from cura.Settings.GlobalStack import GlobalStack +from .AutoSave import AutoSave +from .SingleInstance import SingleInstance if TYPE_CHECKING: from UM.Settings.EmptyInstanceContainer import EmptyInstanceContainer diff --git a/cura/UltimakerCloudAuthentication.py b/cura/UltimakerCloud/UltimakerCloudAuthentication.py similarity index 100% rename from cura/UltimakerCloudAuthentication.py rename to cura/UltimakerCloud/UltimakerCloudAuthentication.py diff --git a/plugins/Toolbox/src/UltimakerCloudScope.py b/cura/UltimakerCloud/UltimakerCloudScope.py similarity index 65% rename from plugins/Toolbox/src/UltimakerCloudScope.py rename to cura/UltimakerCloud/UltimakerCloudScope.py index 14583d7d59..0e9adaf2e7 100644 --- a/plugins/Toolbox/src/UltimakerCloudScope.py +++ b/cura/UltimakerCloud/UltimakerCloudScope.py @@ -6,17 +6,20 @@ from cura.API import Account from cura.CuraApplication import CuraApplication -## Add a Authorization header to the request for Ultimaker Cloud Api requests. -# When the user is not logged in or a token is not available, a warning will be logged -# Also add the user agent headers (see DefaultUserAgentScope) class UltimakerCloudScope(DefaultUserAgentScope): + """Add an Authorization header to the request for Ultimaker Cloud Api requests. + + When the user is not logged in or a token is not available, a warning will be logged + Also add the user agent headers (see DefaultUserAgentScope) + """ + def __init__(self, application: CuraApplication): super().__init__(application) api = application.getCuraAPI() self._account = api.account # type: Account - def request_hook(self, request: QNetworkRequest): - super().request_hook(request) + def requestHook(self, request: QNetworkRequest): + super().requestHook(request) token = self._account.accessToken if not self._account.isLoggedIn or token is None: Logger.warning("Cannot add authorization to Cloud Api request") @@ -25,4 +28,4 @@ class UltimakerCloudScope(DefaultUserAgentScope): header_dict = { "Authorization": "Bearer {}".format(token) } - self.add_headers(request, header_dict) + self.addHeaders(request, header_dict) diff --git a/cura/UltimakerCloud/__init__.py b/cura/UltimakerCloud/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cura_app.py b/cura_app.py index 572b02b77c..33370a1dbe 100755 --- a/cura_app.py +++ b/cura_app.py @@ -23,6 +23,8 @@ import os import Arcus # @UnusedImport import Savitar # @UnusedImport +from PyQt5.QtNetwork import QSslConfiguration, QSslSocket + from UM.Platform import Platform from cura import ApplicationMetadata from cura.ApplicationMetadata import CuraAppName @@ -220,5 +222,10 @@ if Platform.isLinux() and getattr(sys, "frozen", False): import trimesh.exchange.load os.environ["LD_LIBRARY_PATH"] = old_env +if ApplicationMetadata.CuraDebugMode: + ssl_conf = QSslConfiguration.defaultConfiguration() + ssl_conf.setPeerVerifyMode(QSslSocket.VerifyNone) + QSslConfiguration.setDefaultConfiguration(ssl_conf) + app = CuraApplication() app.run() diff --git a/plugins/CuraDrive/src/CreateBackupJob.py b/plugins/CuraDrive/src/CreateBackupJob.py new file mode 100644 index 0000000000..25dc8a4949 --- /dev/null +++ b/plugins/CuraDrive/src/CreateBackupJob.py @@ -0,0 +1,119 @@ +# Copyright (c) 2020 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +import json +import threading +from datetime import datetime +from typing import Any, Dict, Optional + +from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest + +from UM.Job import Job +from UM.Logger import Logger +from UM.Message import Message +from UM.TaskManagement.HttpRequestManager import HttpRequestManager +from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope +from UM.i18n import i18nCatalog +from cura.CuraApplication import CuraApplication +from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope + +catalog = i18nCatalog("cura") + + +class CreateBackupJob(Job): + """Creates backup zip, requests upload url and uploads the backup file to cloud storage.""" + + MESSAGE_TITLE = catalog.i18nc("@info:title", "Backups") + DEFAULT_UPLOAD_ERROR_MESSAGE = catalog.i18nc("@info:backup_status", "There was an error while uploading your backup.") + + def __init__(self, api_backup_url: str) -> None: + """ Create a new backup Job. start the job by calling start() + + :param api_backup_url: The url of the 'backups' endpoint of the Cura Drive Api + """ + + super().__init__() + + self._api_backup_url = api_backup_url + self._json_cloud_scope = JsonDecoratorScope(UltimakerCloudScope(CuraApplication.getInstance())) + + self._backup_zip = None # type: Optional[bytes] + self._job_done = threading.Event() + """Set when the job completes. Does not indicate success.""" + self.backup_upload_error_message = "" + """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.show() + CuraApplication.getInstance().processEvents() + cura_api = CuraApplication.getInstance().getCuraAPI() + self._backup_zip, backup_meta_data = cura_api.backups.createBackup() + + if not self._backup_zip or not backup_meta_data: + self.backup_upload_error_message = catalog.i18nc("@info:backup_status", "There was an error while creating your backup.") + upload_message.hide() + return + + upload_message.setText(catalog.i18nc("@info:backup_status", "Uploading your backup...")) + CuraApplication.getInstance().processEvents() + + # Create an upload entry for the backup. + timestamp = datetime.now().isoformat() + backup_meta_data["description"] = "{}.backup.{}.cura.zip".format(timestamp, backup_meta_data["cura_release"]) + self._requestUploadSlot(backup_meta_data, len(self._backup_zip)) + + self._job_done.wait() + if self.backup_upload_error_message == "": + upload_message.setText(catalog.i18nc("@info:backup_status", "Your backup has finished uploading.")) + upload_message.setProgress(None) # Hide progress bar + else: + # some error occurred. This error is presented to the user by DrivePluginExtension + upload_message.hide() + + def _requestUploadSlot(self, backup_metadata: Dict[str, Any], backup_size: int) -> None: + """Request a backup upload slot from the API. + + :param backup_metadata: A dict containing some meta data about the backup. + :param backup_size: The size of the backup file in bytes. + """ + + payload = json.dumps({"data": {"backup_size": backup_size, + "metadata": backup_metadata + } + }).encode() + + HttpRequestManager.getInstance().put( + self._api_backup_url, + data = payload, + callback = self._onUploadSlotCompleted, + error_callback = self._onUploadSlotCompleted, + scope = self._json_cloud_scope) + + def _onUploadSlotCompleted(self, reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None: + if error is not None: + Logger.warning(str(error)) + self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE + self._job_done.set() + return + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) >= 300: + Logger.warning("Could not request backup upload: %s", HttpRequestManager.readText(reply)) + self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE + self._job_done.set() + return + + backup_upload_url = HttpRequestManager.readJSON(reply)["data"]["upload_url"] + + # Upload the backup to storage. + HttpRequestManager.getInstance().put( + backup_upload_url, + data=self._backup_zip, + callback=self._uploadFinishedCallback, + error_callback=self._uploadFinishedCallback + ) + + def _uploadFinishedCallback(self, reply: QNetworkReply, error: QNetworkReply.NetworkError = None): + if not HttpRequestManager.replyIndicatesSuccess(reply, error): + Logger.log("w", "Could not upload backup file: %s", HttpRequestManager.readText(reply)) + self.backup_upload_error_message = self.DEFAULT_UPLOAD_ERROR_MESSAGE + + self._job_done.set() diff --git a/plugins/CuraDrive/src/DriveApiService.py b/plugins/CuraDrive/src/DriveApiService.py index d8349ccc29..2248b64389 100644 --- a/plugins/CuraDrive/src/DriveApiService.py +++ b/plugins/CuraDrive/src/DriveApiService.py @@ -1,90 +1,70 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import base64 -import hashlib -from datetime import datetime -from tempfile import NamedTemporaryFile -from typing import Any, Optional, List, Dict +from typing import Any, Optional, List, Dict, Callable -import requests +from PyQt5.QtNetwork import QNetworkReply from UM.Logger import Logger -from UM.Message import Message from UM.Signal import Signal, signalemitter +from UM.TaskManagement.HttpRequestManager import HttpRequestManager +from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope +from UM.i18n import i18nCatalog from cura.CuraApplication import CuraApplication - -from .UploadBackupJob import UploadBackupJob +from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope +from .CreateBackupJob import CreateBackupJob +from .RestoreBackupJob import RestoreBackupJob from .Settings import Settings -from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") -## The DriveApiService is responsible for interacting with the CuraDrive API and Cura's backup handling. @signalemitter class DriveApiService: + """The DriveApiService is responsible for interacting with the CuraDrive API and Cura's backup handling.""" + BACKUP_URL = "{}/backups".format(Settings.DRIVE_API_URL) - # Emit signal when restoring backup started or finished. restoringStateChanged = Signal() + """Emits signal when restoring backup started or finished.""" - # Emit signal when creating backup started or finished. creatingStateChanged = Signal() + """Emits signal when creating backup started or finished.""" def __init__(self) -> None: self._cura_api = CuraApplication.getInstance().getCuraAPI() + self._json_cloud_scope = JsonDecoratorScope(UltimakerCloudScope(CuraApplication.getInstance())) - def getBackups(self) -> List[Dict[str, Any]]: - access_token = self._cura_api.account.accessToken - if not access_token: - Logger.log("w", "Could not get access token.") - return [] - try: - backup_list_request = requests.get(self.BACKUP_URL, headers = { - "Authorization": "Bearer {}".format(access_token) - }) - except requests.exceptions.ConnectionError: - Logger.logException("w", "Unable to connect with the server.") - return [] + def getBackups(self, changed: Callable[[List[Dict[str, Any]]], None]) -> None: + def callback(reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None: + if error is not None: + Logger.log("w", "Could not get backups: " + str(error)) + changed([]) + return - # HTTP status 300s mean redirection. 400s and 500s are errors. - # Technically 300s are not errors, but the use case here relies on "requests" to handle redirects automatically. - if backup_list_request.status_code >= 300: - Logger.log("w", "Could not get backups list from remote: %s", backup_list_request.text) - Message(catalog.i18nc("@info:backup_status", "There was an error listing your backups."), title = catalog.i18nc("@info:title", "Backup")).show() - return [] + backup_list_response = HttpRequestManager.readJSON(reply) + if "data" not in backup_list_response: + Logger.log("w", "Could not get backups from remote, actual response body was: %s", + str(backup_list_response)) + changed([]) # empty list of backups + return - backup_list_response = backup_list_request.json() - if "data" not in backup_list_response: - Logger.log("w", "Could not get backups from remote, actual response body was: %s", str(backup_list_response)) - return [] + changed(backup_list_response["data"]) - return backup_list_response["data"] + HttpRequestManager.getInstance().get( + self.BACKUP_URL, + callback= callback, + error_callback = callback, + scope=self._json_cloud_scope + ) def createBackup(self) -> None: self.creatingStateChanged.emit(is_creating = True) - - # Create the backup. - backup_zip_file, backup_meta_data = self._cura_api.backups.createBackup() - if not backup_zip_file or not backup_meta_data: - self.creatingStateChanged.emit(is_creating = False, error_message ="Could not create backup.") - return - - # Create an upload entry for the backup. - timestamp = datetime.now().isoformat() - backup_meta_data["description"] = "{}.backup.{}.cura.zip".format(timestamp, backup_meta_data["cura_release"]) - backup_upload_url = self._requestBackupUpload(backup_meta_data, len(backup_zip_file)) - if not backup_upload_url: - self.creatingStateChanged.emit(is_creating = False, error_message ="Could not upload backup.") - return - - # Upload the backup to storage. - upload_backup_job = UploadBackupJob(backup_upload_url, backup_zip_file) + upload_backup_job = CreateBackupJob(self.BACKUP_URL) upload_backup_job.finished.connect(self._onUploadFinished) upload_backup_job.start() - def _onUploadFinished(self, job: "UploadBackupJob") -> None: + def _onUploadFinished(self, job: "CreateBackupJob") -> None: if job.backup_upload_error_message != "": # If the job contains an error message we pass it along so the UI can display it. self.creatingStateChanged.emit(is_creating = False, error_message = job.backup_upload_error_message) @@ -96,96 +76,38 @@ class DriveApiService: download_url = backup.get("download_url") if not download_url: # If there is no download URL, we can't restore the backup. - return self._emitRestoreError() + Logger.warning("backup download_url is missing. Aborting backup.") + self.restoringStateChanged.emit(is_restoring = False, + error_message = catalog.i18nc("@info:backup_status", + "There was an error trying to restore your backup.")) + return - try: - download_package = requests.get(download_url, stream = True) - except requests.exceptions.ConnectionError: - Logger.logException("e", "Unable to connect with the server") - return self._emitRestoreError() + restore_backup_job = RestoreBackupJob(backup) + restore_backup_job.finished.connect(self._onRestoreFinished) + restore_backup_job.start() - if download_package.status_code >= 300: - # Something went wrong when attempting to download the backup. - Logger.log("w", "Could not download backup from url %s: %s", download_url, download_package.text) - return self._emitRestoreError() + def _onRestoreFinished(self, job: "RestoreBackupJob") -> None: + if job.restore_backup_error_message != "": + # If the job contains an error message we pass it along so the UI can display it. + self.restoringStateChanged.emit(is_restoring=False) + else: + self.restoringStateChanged.emit(is_restoring = False, error_message = job.restore_backup_error_message) - # We store the file in a temporary path fist to ensure integrity. - temporary_backup_file = NamedTemporaryFile(delete = False) - with open(temporary_backup_file.name, "wb") as write_backup: - for chunk in download_package: - write_backup.write(chunk) + def deleteBackup(self, backup_id: str, finished_callable: Callable[[bool], None]): - if not self._verifyMd5Hash(temporary_backup_file.name, backup.get("md5_hash", "")): - # Don't restore the backup if the MD5 hashes do not match. - # This can happen if the download was interrupted. - Logger.log("w", "Remote and local MD5 hashes do not match, not restoring backup.") - return self._emitRestoreError() + def finishedCallback(reply: QNetworkReply, ca: Callable[[bool], None] = finished_callable) -> None: + self._onDeleteRequestCompleted(reply, ca) - # Tell Cura to place the backup back in the user data folder. - with open(temporary_backup_file.name, "rb") as read_backup: - self._cura_api.backups.restoreBackup(read_backup.read(), backup.get("metadata", {})) - self.restoringStateChanged.emit(is_restoring = False) + def errorCallback(reply: QNetworkReply, error: QNetworkReply.NetworkError, ca: Callable[[bool], None] = finished_callable) -> None: + self._onDeleteRequestCompleted(reply, ca, error) - def _emitRestoreError(self) -> None: - self.restoringStateChanged.emit(is_restoring = False, - error_message = catalog.i18nc("@info:backup_status", - "There was an error trying to restore your backup.")) + HttpRequestManager.getInstance().delete( + url = "{}/{}".format(self.BACKUP_URL, backup_id), + callback = finishedCallback, + error_callback = errorCallback, + scope= self._json_cloud_scope + ) - # Verify the MD5 hash of a file. - # \param file_path Full path to the file. - # \param known_hash The known MD5 hash of the file. - # \return: Success or not. @staticmethod - def _verifyMd5Hash(file_path: str, known_hash: str) -> bool: - with open(file_path, "rb") as read_backup: - local_md5_hash = base64.b64encode(hashlib.md5(read_backup.read()).digest(), altchars = b"_-").decode("utf-8") - return known_hash == local_md5_hash - - def deleteBackup(self, backup_id: str) -> bool: - access_token = self._cura_api.account.accessToken - if not access_token: - Logger.log("w", "Could not get access token.") - return False - - try: - delete_backup = requests.delete("{}/{}".format(self.BACKUP_URL, backup_id), headers = { - "Authorization": "Bearer {}".format(access_token) - }) - except requests.exceptions.ConnectionError: - Logger.logException("e", "Unable to connect with the server") - return False - - if delete_backup.status_code >= 300: - Logger.log("w", "Could not delete backup: %s", delete_backup.text) - return False - return True - - # Request a backup upload slot from the API. - # \param backup_metadata: A dict containing some meta data about the backup. - # \param backup_size The size of the backup file in bytes. - # \return: The upload URL for the actual backup file if successful, otherwise None. - def _requestBackupUpload(self, backup_metadata: Dict[str, Any], backup_size: int) -> Optional[str]: - access_token = self._cura_api.account.accessToken - if not access_token: - Logger.log("w", "Could not get access token.") - return None - try: - backup_upload_request = requests.put( - self.BACKUP_URL, - json = {"data": {"backup_size": backup_size, - "metadata": backup_metadata - } - }, - headers = { - "Authorization": "Bearer {}".format(access_token) - }) - except requests.exceptions.ConnectionError: - Logger.logException("e", "Unable to connect with the server") - return None - - # Any status code of 300 or above indicates an error. - if backup_upload_request.status_code >= 300: - Logger.log("w", "Could not request backup upload: %s", backup_upload_request.text) - return None - - return backup_upload_request.json()["data"]["upload_url"] + def _onDeleteRequestCompleted(reply: QNetworkReply, callable: Callable[[bool], None], error: Optional["QNetworkReply.NetworkError"] = None) -> None: + callable(HttpRequestManager.replyIndicatesSuccess(reply, error)) diff --git a/plugins/CuraDrive/src/DrivePluginExtension.py b/plugins/CuraDrive/src/DrivePluginExtension.py index bcc326a133..8de4876f52 100644 --- a/plugins/CuraDrive/src/DrivePluginExtension.py +++ b/plugins/CuraDrive/src/DrivePluginExtension.py @@ -133,7 +133,10 @@ class DrivePluginExtension(QObject, Extension): @pyqtSlot(name = "refreshBackups") def refreshBackups(self) -> None: - self._backups = self._drive_api_service.getBackups() + self._drive_api_service.getBackups(self._backupsChangedCallback) + + def _backupsChangedCallback(self, backups: List[Dict[str, Any]]) -> None: + self._backups = backups self.backupsChanged.emit() @pyqtProperty(bool, notify = restoringStateChanged) @@ -158,5 +161,8 @@ class DrivePluginExtension(QObject, Extension): @pyqtSlot(str, name = "deleteBackup") def deleteBackup(self, backup_id: str) -> None: - self._drive_api_service.deleteBackup(backup_id) - self.refreshBackups() + self._drive_api_service.deleteBackup(backup_id, self._backupDeletedCallback) + + def _backupDeletedCallback(self, success: bool): + if success: + self.refreshBackups() diff --git a/plugins/CuraDrive/src/RestoreBackupJob.py b/plugins/CuraDrive/src/RestoreBackupJob.py new file mode 100644 index 0000000000..c60de116e0 --- /dev/null +++ b/plugins/CuraDrive/src/RestoreBackupJob.py @@ -0,0 +1,92 @@ +import base64 +import hashlib +import threading +from tempfile import NamedTemporaryFile +from typing import Optional, Any, Dict + +from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest + +from UM.Job import Job +from UM.Logger import Logger +from UM.PackageManager import catalog +from UM.TaskManagement.HttpRequestManager import HttpRequestManager +from cura.CuraApplication import CuraApplication + + +class RestoreBackupJob(Job): + """Downloads a backup and overwrites local configuration with the backup. + + When `Job.finished` emits, `restore_backup_error_message` will either be `""` (no error) or an error message + """ + + DISK_WRITE_BUFFER_SIZE = 512 * 1024 + DEFAULT_ERROR_MESSAGE = catalog.i18nc("@info:backup_status", "There was an error trying to restore your backup.") + + def __init__(self, backup: Dict[str, Any]) -> None: + """ Create a new restore Job. start the job by calling start() + + :param backup: A dict containing a backup spec + """ + + super().__init__() + self._job_done = threading.Event() + + self._backup = backup + self.restore_backup_error_message = "" + + def run(self) -> None: + + url = self._backup.get("download_url") + assert url is not None + + HttpRequestManager.getInstance().get( + url = url, + callback = self._onRestoreRequestCompleted, + error_callback = self._onRestoreRequestCompleted + ) + + self._job_done.wait() # A job is considered finished when the run function completes + + def _onRestoreRequestCompleted(self, reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None: + if not HttpRequestManager.replyIndicatesSuccess(reply, error): + Logger.warning("Requesting backup failed, response code %s while trying to connect to %s", + reply.attribute(QNetworkRequest.HttpStatusCodeAttribute), reply.url()) + self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE + self._job_done.set() + return + + # We store the file in a temporary path fist to ensure integrity. + temporary_backup_file = NamedTemporaryFile(delete = False) + with open(temporary_backup_file.name, "wb") as write_backup: + app = CuraApplication.getInstance() + bytes_read = reply.read(self.DISK_WRITE_BUFFER_SIZE) + while bytes_read: + write_backup.write(bytes_read) + bytes_read = reply.read(self.DISK_WRITE_BUFFER_SIZE) + app.processEvents() + + if not self._verifyMd5Hash(temporary_backup_file.name, self._backup.get("md5_hash", "")): + # Don't restore the backup if the MD5 hashes do not match. + # This can happen if the download was interrupted. + Logger.log("w", "Remote and local MD5 hashes do not match, not restoring backup.") + self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE + + # Tell Cura to place the backup back in the user data folder. + with open(temporary_backup_file.name, "rb") as read_backup: + cura_api = CuraApplication.getInstance().getCuraAPI() + cura_api.backups.restoreBackup(read_backup.read(), self._backup.get("metadata", {})) + + self._job_done.set() + + @staticmethod + def _verifyMd5Hash(file_path: str, known_hash: str) -> bool: + """Verify the MD5 hash of a file. + + :param file_path: Full path to the file. + :param known_hash: The known MD5 hash of the file. + :return: Success or not. + """ + + with open(file_path, "rb") as read_backup: + local_md5_hash = base64.b64encode(hashlib.md5(read_backup.read()).digest(), altchars = b"_-").decode("utf-8") + return known_hash == local_md5_hash diff --git a/plugins/CuraDrive/src/Settings.py b/plugins/CuraDrive/src/Settings.py index abe64e0acd..639c63b45f 100644 --- a/plugins/CuraDrive/src/Settings.py +++ b/plugins/CuraDrive/src/Settings.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from cura import UltimakerCloudAuthentication +from cura.UltimakerCloud import UltimakerCloudAuthentication class Settings: diff --git a/plugins/CuraDrive/src/UploadBackupJob.py b/plugins/CuraDrive/src/UploadBackupJob.py deleted file mode 100644 index 2e76ed9b4b..0000000000 --- a/plugins/CuraDrive/src/UploadBackupJob.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2018 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -import requests - -from UM.Job import Job -from UM.Logger import Logger -from UM.Message import Message - -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - - -class UploadBackupJob(Job): - MESSAGE_TITLE = catalog.i18nc("@info:title", "Backups") - - # This job is responsible for uploading the backup file to cloud storage. - # As it can take longer than some other tasks, we schedule this using a Cura Job. - def __init__(self, signed_upload_url: str, backup_zip: bytes) -> None: - super().__init__() - self._signed_upload_url = signed_upload_url - self._backup_zip = backup_zip - self._upload_success = False - self.backup_upload_error_message = "" - - def run(self) -> None: - upload_message = Message(catalog.i18nc("@info:backup_status", "Uploading your backup..."), title = self.MESSAGE_TITLE, progress = -1) - upload_message.show() - - backup_upload = requests.put(self._signed_upload_url, data = self._backup_zip) - upload_message.hide() - - if backup_upload.status_code >= 300: - self.backup_upload_error_message = backup_upload.text - Logger.log("w", "Could not upload backup file: %s", backup_upload.text) - Message(catalog.i18nc("@info:backup_status", "There was an error while uploading your backup."), title = self.MESSAGE_TITLE).show() - else: - self._upload_success = True - Message(catalog.i18nc("@info:backup_status", "Your backup has finished uploading."), title = self.MESSAGE_TITLE).show() - - self.finished.emit(self) diff --git a/plugins/Toolbox/src/CloudApiModel.py b/plugins/Toolbox/src/CloudApiModel.py index 556d54cf88..3386cffb51 100644 --- a/plugins/Toolbox/src/CloudApiModel.py +++ b/plugins/Toolbox/src/CloudApiModel.py @@ -1,6 +1,7 @@ from typing import Union -from cura import ApplicationMetadata, UltimakerCloudAuthentication +from cura import ApplicationMetadata +from cura.UltimakerCloud import UltimakerCloudAuthentication class CloudApiModel: diff --git a/plugins/Toolbox/src/CloudSync/CloudApiClient.py b/plugins/Toolbox/src/CloudSync/CloudApiClient.py index 6c14aea26c..21eb1bdbd2 100644 --- a/plugins/Toolbox/src/CloudSync/CloudApiClient.py +++ b/plugins/Toolbox/src/CloudSync/CloudApiClient.py @@ -1,8 +1,9 @@ from UM.Logger import Logger from UM.TaskManagement.HttpRequestManager import HttpRequestManager +from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope from cura.CuraApplication import CuraApplication +from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope from ..CloudApiModel import CloudApiModel -from ..UltimakerCloudScope import UltimakerCloudScope class CloudApiClient: @@ -26,7 +27,7 @@ class CloudApiClient: if self.__instance is not None: raise RuntimeError("This is a Singleton. use getInstance()") - self._scope = UltimakerCloudScope(app) # type: UltimakerCloudScope + self._scope = JsonDecoratorScope(UltimakerCloudScope(app)) # type: JsonDecoratorScope app.getPackageManager().packageInstalled.connect(self._onPackageInstalled) diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index 5767f9f002..9b0f51d247 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import json +from typing import List, Dict, Any from typing import Optional from PyQt5.QtCore import QObject @@ -11,12 +12,12 @@ from UM import i18nCatalog from UM.Logger import Logger from UM.Message import Message from UM.Signal import Signal +from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope from cura.CuraApplication import CuraApplication, ApplicationMetadata -from ..CloudApiModel import CloudApiModel +from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope from .SubscribedPackagesModel import SubscribedPackagesModel -from ..UltimakerCloudScope import UltimakerCloudScope +from ..CloudApiModel import CloudApiModel -from typing import List, Dict, Any class CloudPackageChecker(QObject): def __init__(self, application: CuraApplication) -> None: @@ -24,7 +25,7 @@ class CloudPackageChecker(QObject): self.discrepancies = Signal() # Emits SubscribedPackagesModel self._application = application # type: CuraApplication - self._scope = UltimakerCloudScope(application) + self._scope = JsonDecoratorScope(UltimakerCloudScope(application)) self._model = SubscribedPackagesModel() self._message = None # type: Optional[Message] @@ -111,4 +112,4 @@ class CloudPackageChecker(QObject): def _onSyncButtonClicked(self, sync_message: Message, sync_message_action: str) -> None: sync_message.hide() - self.discrepancies.emit(self._model) \ No newline at end of file + self.discrepancies.emit(self._model) diff --git a/plugins/Toolbox/src/CloudSync/DownloadPresenter.py b/plugins/Toolbox/src/CloudSync/DownloadPresenter.py index 743d96c574..a5d6eee0b6 100644 --- a/plugins/Toolbox/src/CloudSync/DownloadPresenter.py +++ b/plugins/Toolbox/src/CloudSync/DownloadPresenter.py @@ -12,8 +12,8 @@ from UM.Message import Message from UM.Signal import Signal from UM.TaskManagement.HttpRequestManager import HttpRequestManager from cura.CuraApplication import CuraApplication +from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope from .SubscribedPackagesModel import SubscribedPackagesModel -from ..UltimakerCloudScope import UltimakerCloudScope ## Downloads a set of packages from the Ultimaker Cloud Marketplace diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 55c6ba223b..38666bb6e2 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -9,22 +9,20 @@ from typing import cast, Any, Dict, List, Set, TYPE_CHECKING, Tuple, Optional, U from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal, pyqtSlot from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply +from UM.Extension import Extension from UM.Logger import Logger from UM.PluginRegistry import PluginRegistry -from UM.Extension import Extension -from UM.i18n import i18nCatalog +from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope from UM.Version import Version - +from UM.i18n import i18nCatalog from cura import ApplicationMetadata - from cura.CuraApplication import CuraApplication from cura.Machines.ContainerTree import ContainerTree - -from .CloudApiModel import CloudApiModel +from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope from .AuthorsModel import AuthorsModel +from .CloudApiModel import CloudApiModel from .CloudSync.LicenseModel import LicenseModel from .PackagesModel import PackagesModel -from .UltimakerCloudScope import UltimakerCloudScope if TYPE_CHECKING: from UM.TaskManagement.HttpRequestData import HttpRequestData @@ -54,7 +52,8 @@ class Toolbox(QObject, Extension): self._download_request_data = None # type: Optional[HttpRequestData] self._download_progress = 0 # type: float self._is_downloading = False # type: bool - self._scope = UltimakerCloudScope(application) # type: UltimakerCloudScope + self._cloud_scope = UltimakerCloudScope(application) # type: UltimakerCloudScope + self._json_scope = JsonDecoratorScope(self._cloud_scope) # type: JsonDecoratorScope self._request_urls = {} # type: Dict[str, str] self._to_update = [] # type: List[str] # Package_ids that are waiting to be updated @@ -151,7 +150,7 @@ class Toolbox(QObject, Extension): url = "{base_url}/packages/{package_id}/ratings".format(base_url = CloudApiModel.api_url, package_id = package_id) data = "{\"data\": {\"cura_version\": \"%s\", \"rating\": %i}}" % (Version(self._application.getVersion()), rating) - self._application.getHttpRequestManager().put(url, data = data.encode(), scope = self._scope) + self._application.getHttpRequestManager().put(url, data = data.encode(), scope = self._json_scope) def getLicenseDialogPluginFileLocation(self) -> str: return self._license_dialog_plugin_file_location @@ -541,7 +540,7 @@ class Toolbox(QObject, Extension): self._application.getHttpRequestManager().get(url, callback = callback, error_callback = error_callback, - scope=self._scope) + scope=self._json_scope) @pyqtSlot(str) def startDownload(self, url: str) -> None: @@ -554,7 +553,7 @@ class Toolbox(QObject, Extension): callback = callback, error_callback = error_callback, download_progress_callback = download_progress_callback, - scope=self._scope + scope=self._cloud_scope ) self._download_request_data = request_data diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py index ed8d22a478..6fec436843 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py @@ -9,18 +9,16 @@ from PyQt5.QtCore import QUrl from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkAccessManager from UM.Logger import Logger -from cura import UltimakerCloudAuthentication from cura.API import Account - +from cura.UltimakerCloud import UltimakerCloudAuthentication from .ToolPathUploader import ToolPathUploader from ..Models.BaseModel import BaseModel from ..Models.Http.CloudClusterResponse import CloudClusterResponse -from ..Models.Http.CloudError import CloudError from ..Models.Http.CloudClusterStatus import CloudClusterStatus +from ..Models.Http.CloudError import CloudError +from ..Models.Http.CloudPrintJobResponse import CloudPrintJobResponse from ..Models.Http.CloudPrintJobUploadRequest import CloudPrintJobUploadRequest from ..Models.Http.CloudPrintResponse import CloudPrintResponse -from ..Models.Http.CloudPrintJobResponse import CloudPrintJobResponse - ## The generic type variable used to document the methods below. CloudApiClientModel = TypeVar("CloudApiClientModel", bound=BaseModel) diff --git a/resources/definitions/abax_pri3.def.json b/resources/definitions/abax_pri3.def.json index 529636be90..8f0d1a97d8 100644 --- a/resources/definitions/abax_pri3.def.json +++ b/resources/definitions/abax_pri3.def.json @@ -44,7 +44,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1 + "value": "1" }, "top_bottom_thickness": { "default_value": 1 diff --git a/resources/definitions/abax_pri5.def.json b/resources/definitions/abax_pri5.def.json index 9e4e7e3b20..5730cc6e05 100644 --- a/resources/definitions/abax_pri5.def.json +++ b/resources/definitions/abax_pri5.def.json @@ -44,7 +44,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1 + "value": "1" }, "top_bottom_thickness": { "default_value": 1 diff --git a/resources/definitions/abax_titan.def.json b/resources/definitions/abax_titan.def.json index 98643df22b..dc5dd3b14f 100644 --- a/resources/definitions/abax_titan.def.json +++ b/resources/definitions/abax_titan.def.json @@ -44,7 +44,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1 + "value": "1" }, "top_bottom_thickness": { "default_value": 1 diff --git a/resources/definitions/alfawise_u20.def.json b/resources/definitions/alfawise_u20.def.json index 4da42fdb1d..5b9b8471c6 100644 --- a/resources/definitions/alfawise_u20.def.json +++ b/resources/definitions/alfawise_u20.def.json @@ -51,7 +51,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "speed_print": { "default_value": 40 diff --git a/resources/definitions/alfawise_u30.def.json b/resources/definitions/alfawise_u30.def.json index e05536f66c..3bfc1aaa4e 100644 --- a/resources/definitions/alfawise_u30.def.json +++ b/resources/definitions/alfawise_u30.def.json @@ -23,7 +23,7 @@ }, "material_diameter": { "default_value": 1.75 }, "layer_height_0": { "default_value": 0.2 }, - "wall_thickness": { "default_value": 1.2 }, + "wall_thickness": { "value": "1.2" }, "speed_print": { "default_value": 40 }, "support_enable": { "default_value": true }, "retraction_enable": { "default_value": true }, diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index d9e84dae87..6d81d2d0d5 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -49,7 +49,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1 + "value": "1" }, "top_bottom_thickness": { "default_value": 1 diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index 5c122eb9a4..ddc6197490 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -26,7 +26,7 @@ "machine_center_is_zero": { "default_value": false }, "layer_height": { "default_value": 0.2 }, "layer_height_0": { "default_value": 0.2 }, - "wall_thickness": { "default_value": 1.2 }, + "wall_thickness": { "value": "1.2" }, "top_bottom_thickness": { "default_value": 1.2 }, "infill_sparse_density": { "default_value": 20 }, "speed_print": { "default_value": 60 }, diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index 16d0953bf1..24344b6aba 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -48,7 +48,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1 + "value": "1" }, "top_bottom_thickness": { "default_value": 1 diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index fce2af9f97..085adf1afb 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -49,7 +49,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1 + "value": "1" }, "top_bottom_thickness": { "default_value": 1 diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json index d1114aafd6..d0d1dddb53 100644 --- a/resources/definitions/bq_witbox_2.def.json +++ b/resources/definitions/bq_witbox_2.def.json @@ -48,7 +48,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "top_bottom_thickness": { "default_value": 1.2 diff --git a/resources/definitions/cocoon_create_modelmaker.def.json b/resources/definitions/cocoon_create_modelmaker.def.json index b738dc64ff..51c5b5e7cb 100644 --- a/resources/definitions/cocoon_create_modelmaker.def.json +++ b/resources/definitions/cocoon_create_modelmaker.def.json @@ -54,7 +54,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "top_bottom_thickness": { "default_value": 0.6 diff --git a/resources/definitions/creality_cr-x.def.json b/resources/definitions/creality_cr-x.def.json index 13409a7212..3d13c0f703 100644 --- a/resources/definitions/creality_cr-x.def.json +++ b/resources/definitions/creality_cr-x.def.json @@ -41,7 +41,7 @@ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { "default_value": "G21 ;metric values\nG28 ;home all\nG90 ;absolute positioning\nM107 ;start with the fan off\nG1 F2400 Z15.0 ;raise the nozzle 15mm\nM109 S{material_print_temperature} ;Set Extruder Temperature and Wait\nM190 S{material_bed_temperature}; Wait for bed temperature to reach target temp\nT0 ;Switch to Extruder 1\nG1 F3000 X5 Y10 Z0.2 ;move to prime start position\nG92 E0 ;reset extrusion distance\nG1 F600 X160 E15 ;prime nozzle in a line\nG1 F5000 X180 ;quick wipe\nG92 E0 ;reset extrusion distance" }, "machine_end_gcode": { "default_value": "M104 S0 ;hotend off\nM140 S0 ;bed off\nG92 E0\nG1 F2000 E-100 ;retract filament 100mm\nG92 E0\nG1 F3000 X0 Y270 ;move bed for easy part removal\nM84 ;disable steppers" }, - "wall_thickness": { "default_value": 1 }, + "wall_thickness": { "value": "1" }, "top_bottom_thickness": { "default_value": 1 } } } diff --git a/resources/definitions/cubicon_common.def.json b/resources/definitions/cubicon_common.def.json index 6b1e3d953e..61e684a283 100644 --- a/resources/definitions/cubicon_common.def.json +++ b/resources/definitions/cubicon_common.def.json @@ -46,7 +46,7 @@ "max_skin_angle_for_expansion": { "default_value": 90 }, "skin_angles": { "default_value": "[135,45]" }, "coasting_volume": { "default_value": 0.032 }, - "wall_thickness": { "default_value": 1.2 }, + "wall_thickness": { "value": "1.2" }, "cool_min_layer_time_fan_speed_max": { "default_value": 15 }, "cool_min_layer_time": { "default_value": 15 }, "support_interface_pattern": { "default_value": "zigzag" }, diff --git a/resources/definitions/deltabot.def.json b/resources/definitions/deltabot.def.json index ad6a207bb2..6dbdfb418f 100644 --- a/resources/definitions/deltabot.def.json +++ b/resources/definitions/deltabot.def.json @@ -3,7 +3,7 @@ "version": 2, "inherits": "fdmprinter", "metadata": { - "visible": true, + "visible": false, "author": "Ultimaker", "manufacturer": "Custom", "file_formats": "text/x-gcode", diff --git a/resources/definitions/easyarts_ares.def.json b/resources/definitions/easyarts_ares.def.json index 18d73a3531..8751f2c3e1 100644 --- a/resources/definitions/easyarts_ares.def.json +++ b/resources/definitions/easyarts_ares.def.json @@ -44,7 +44,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1 + "value": "1" }, "top_bottom_thickness": { "default_value": 1 diff --git a/resources/definitions/fabxpro.def.json b/resources/definitions/fabxpro.def.json new file mode 100644 index 0000000000..b70cc3b029 --- /dev/null +++ b/resources/definitions/fabxpro.def.json @@ -0,0 +1,58 @@ +{ + "version": 2, + "name": "FabX Pro", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "FabX", + "manufacturer": "FabX", + "file_formats": "text/x-gcode", + "platform": "fabxpro_platform.STL", + "has_materials": true, + "has_machine_quality": true, + "machine_extruder_trains": + { + "0": "fabxpro_extruder_0" + } + }, + + "overrides": { + "machine_name": { "default_value": "FabX Pro" }, + "machine_width": { + "default_value": 170 + }, + "machine_height": { + "default_value": 170 + }, + "machine_depth": { + "default_value": 170 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [ -75, 35 ], + [ -75, -18 ], + [ 18, 35 ], + [ 18, -18 ] + ] + }, + "gantry_height": { + "value": "55" + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "value": "'M104 S0 ;extruder heater off' + ('\\nM140 S0 ;heated bed heater off' if machine_heated_bed else '') + '\\nG91 ;relative positioning\\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\\nM84 ;steppers off\\nG90 ;absolute positioning'" + } + } +} diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 721876334a..8b19c5867f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1032,6 +1032,7 @@ "description": "The thickness of the walls in the horizontal direction. This value divided by the wall line width defines the number of walls.", "unit": "mm", "default_value": 0.8, + "value": "wall_line_width_0 if magic_spiralize else 0.8", "minimum_value": "0", "minimum_value_warning": "line_width", "maximum_value_warning": "10 * line_width", diff --git a/resources/definitions/felixpro2dual.def.json b/resources/definitions/felixpro2dual.def.json index fdd8a1b694..7c883b2f76 100644 --- a/resources/definitions/felixpro2dual.def.json +++ b/resources/definitions/felixpro2dual.def.json @@ -26,7 +26,7 @@ "layer_height_0": { "default_value": 0.2 }, "infill_sparse_density": { "default_value": 20 }, - "wall_thickness": { "default_value": 1 }, + "wall_thickness": { "value": "1" }, "top_bottom_thickness": { "default_value": 1 }, "machine_width": { "default_value": 240 }, diff --git a/resources/definitions/felixtec4dual.def.json b/resources/definitions/felixtec4dual.def.json index efc13c1759..439e4473d0 100644 --- a/resources/definitions/felixtec4dual.def.json +++ b/resources/definitions/felixtec4dual.def.json @@ -25,7 +25,7 @@ "layer_height": { "default_value": 0.2 }, "layer_height_0": { "default_value": 0.3 }, "infill_sparse_density": { "default_value": 20 }, - "wall_thickness": { "default_value": 1 }, + "wall_thickness": { "value": "1" }, "top_bottom_thickness": { "default_value": 1 }, "infill_pattern": { "value": "'tetrahedral'" }, diff --git a/resources/definitions/geeetech_A10M.def.json b/resources/definitions/geeetech_A10M.def.json index d74a04f1ec..6a25e4c407 100644 --- a/resources/definitions/geeetech_A10M.def.json +++ b/resources/definitions/geeetech_A10M.def.json @@ -45,7 +45,7 @@ "machine_max_jerk_e": { "default_value": 2.5 }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "G28 \nG1 Z15 F300\nM107\nG90\nM82\nM104 S215\nM140 S55\nG92 E0\nM109 S215\nM107\nM163 S0 P0.50\nM163 S1 P0.50\nM164 S4\nG0 X10 Y20 F6000\nG1 Z0.8\nG1 F300 X180 E40\nG1 F1200 Z2\nG92 E0\nG28" + "default_value": ";GeeeTech A10M start script\nG28 ;home\nG90 ;absolute positioning\nG1 X0 Y0 Z15 E0 F300 ;go to wait position\nM140 S{material_bed_temperature_layer_0} ;set bed temp\nM190 S{material_print_temperature_layer_0} ;set extruder temp and wait\nG1 Z0.8 F200 ;set extruder height\nG1 X220 Y0 E80 F1000 ;purge line\n;end of start script" }, "machine_end_gcode": { "default_value": "G91\nG1 E-1\nG0 X0 Y200\nM104 S0\nG90\nG92 E0\nM140 S0\nM84\nM104 S0\nM140 S0\nM84" diff --git a/resources/definitions/geeetech_A20M.def.json b/resources/definitions/geeetech_A20M.def.json index 5c38728ed1..476741c7fe 100644 --- a/resources/definitions/geeetech_A20M.def.json +++ b/resources/definitions/geeetech_A20M.def.json @@ -45,7 +45,7 @@ "machine_max_jerk_e": { "default_value": 2.5 }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "G28 \nG1 Z15 F300\nM107\nG90\nM82\nM104 S215\nM140 S55\nG92 E0\nM109 S215\nM107\nM163 S0 P0.50\nM163 S1 P0.50\nM164 S4\nG0 X10 Y20 F6000\nG1 Z0.8\nG1 F300 X200 E40\nG1 F1200 Z2\nG92 E0\nG28" + "default_value": ";GeeeTech A20M start script\nG28 ;home\nG90 ;absolute positioning\nG1 X0 Y0 Z15 E0 F300 ;go to wait position\nM140 S{material_bed_temperature_layer_0} ;set bed temp\nM190 S{material_print_temperature_layer_0} ;set extruder temp and wait\nG1 Z0.8 F200 ;set extruder height\nG1 X220 Y0 E80 F1000 ;purge line\n;end of start script" }, "machine_end_gcode": { "default_value": "G91\nG1 E-1\nG0 X0 Y200\nM104 S0\nG90\nG92 E0\nM140 S0\nM84\nM104 S0\nM140 S0\nM84" diff --git a/resources/definitions/gmax15plus.def.json b/resources/definitions/gmax15plus.def.json index e98d6c02fe..7cafa09727 100644 --- a/resources/definitions/gmax15plus.def.json +++ b/resources/definitions/gmax15plus.def.json @@ -48,7 +48,7 @@ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home X/Y/Z\nM104 S{material_print_temperature} ; Preheat\nM109 S{material_print_temperature} ; Preheat\nG91 ;relative positioning\nG90 ;absolute positioning\nG1 Z25.0 F9000 ;raise nozzle 25mm\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" }, - "wall_thickness": { "default_value": 1 }, + "wall_thickness": { "value": "1" }, "top_bottom_thickness": { "default_value": 1 } } } diff --git a/resources/definitions/gmax15plus_dual.def.json b/resources/definitions/gmax15plus_dual.def.json index aaba2cc55b..8bfadfc4ba 100644 --- a/resources/definitions/gmax15plus_dual.def.json +++ b/resources/definitions/gmax15plus_dual.def.json @@ -46,7 +46,7 @@ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home X/Y/Z\nM104 S{material_print_temperature} T0 ; Preheat Left Extruder\nM104 S{material_print_temperature} T1 ; Preheat Right Extruder\nM109 S{material_print_temperature} T0 ; Preheat Left Extruder\nM109 S{material_print_temperature} T1 ; Preheat Right Extruder\nG91 ;relative positioning\nG90 ;absolute positioning\nM218 T1 X34.3 Y0; Set 2nd extruder offset. This can be changed later if needed\nG1 Z25.0 F9000 ;raise nozzle 25mm\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { "default_value": "M104 S0 T0;Left extruder off\nM104 S0 T1; Right extruder off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" }, - "wall_thickness": { "default_value": 1 }, + "wall_thickness": { "value": "1" }, "top_bottom_thickness": { "default_value": 1 } } } diff --git a/resources/definitions/helloBEEprusa.def.json b/resources/definitions/helloBEEprusa.def.json index 2c8c4839d0..291253f09c 100644 --- a/resources/definitions/helloBEEprusa.def.json +++ b/resources/definitions/helloBEEprusa.def.json @@ -28,7 +28,7 @@ "machine_center_is_zero": { "default_value": false }, "layer_height": { "default_value": 0.2 }, "layer_height_0": { "default_value": 0.2 }, - "wall_thickness": { "default_value": 1.2 }, + "wall_thickness": { "value": "1.2" }, "top_bottom_thickness": { "default_value": 1.2 }, "infill_sparse_density": { "default_value": 20 }, "speed_print": { "default_value": 60 }, diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index df839b0fe4..9001aba923 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -56,7 +56,7 @@ "default_value": 0.15 }, "wall_thickness": { - "default_value": 0.8 + "value": "0.8" }, "top_bottom_thickness": { "default_value": 1.2 diff --git a/resources/definitions/jgaurora_a1.def.json b/resources/definitions/jgaurora_a1.def.json index 1c910f0d95..a952949b1f 100644 --- a/resources/definitions/jgaurora_a1.def.json +++ b/resources/definitions/jgaurora_a1.def.json @@ -51,7 +51,7 @@ "default_value": 0.12 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "speed_print": { "default_value": 40 diff --git a/resources/definitions/jgaurora_a3s.def.json b/resources/definitions/jgaurora_a3s.def.json index ead0a5f9e7..2427f961c1 100644 --- a/resources/definitions/jgaurora_a3s.def.json +++ b/resources/definitions/jgaurora_a3s.def.json @@ -51,7 +51,7 @@ "default_value": 0.12 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "speed_print": { "default_value": 35 diff --git a/resources/definitions/jgaurora_a5.def.json b/resources/definitions/jgaurora_a5.def.json index b9f179d38e..a31ad3ec56 100644 --- a/resources/definitions/jgaurora_a5.def.json +++ b/resources/definitions/jgaurora_a5.def.json @@ -53,7 +53,7 @@ "default_value": 0.12 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "speed_print": { "default_value": 40 diff --git a/resources/definitions/jgaurora_jgmaker_magic.def.json b/resources/definitions/jgaurora_jgmaker_magic.def.json index 8d0349a48c..58067b6dd3 100644 --- a/resources/definitions/jgaurora_jgmaker_magic.def.json +++ b/resources/definitions/jgaurora_jgmaker_magic.def.json @@ -51,7 +51,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "speed_print": { "default_value": 60 diff --git a/resources/definitions/jgaurora_z_603s.def.json b/resources/definitions/jgaurora_z_603s.def.json index 8dbf5a82bb..d122500dfb 100644 --- a/resources/definitions/jgaurora_z_603s.def.json +++ b/resources/definitions/jgaurora_z_603s.def.json @@ -51,7 +51,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "speed_print": { "default_value": 60 diff --git a/resources/definitions/makeit_pro_l.def.json b/resources/definitions/makeit_pro_l.def.json index d601a5c309..75479fd5cc 100644 --- a/resources/definitions/makeit_pro_l.def.json +++ b/resources/definitions/makeit_pro_l.def.json @@ -81,7 +81,7 @@ "default_value": 60 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "cool_min_layer_time_fan_speed_max": { "default_value": 5 diff --git a/resources/definitions/makeit_pro_m.def.json b/resources/definitions/makeit_pro_m.def.json index 267646b647..812a4fe901 100644 --- a/resources/definitions/makeit_pro_m.def.json +++ b/resources/definitions/makeit_pro_m.def.json @@ -81,7 +81,7 @@ "default_value": 60 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "cool_min_layer_time_fan_speed_max": { "default_value": 5 diff --git a/resources/definitions/makeit_pro_mx.def.json b/resources/definitions/makeit_pro_mx.def.json index 13770e8571..5f922dcd00 100644 --- a/resources/definitions/makeit_pro_mx.def.json +++ b/resources/definitions/makeit_pro_mx.def.json @@ -81,7 +81,7 @@ "default_value": 60 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "cool_min_layer_time_fan_speed_max": { "default_value": 5 diff --git a/resources/definitions/mankati_fullscale_xt_plus.def.json b/resources/definitions/mankati_fullscale_xt_plus.def.json index b6fa040750..fa5c8465c6 100644 --- a/resources/definitions/mankati_fullscale_xt_plus.def.json +++ b/resources/definitions/mankati_fullscale_xt_plus.def.json @@ -39,7 +39,7 @@ }, "layer_height": { "default_value": 0.2 }, - "wall_thickness": { "default_value": 0.8 }, + "wall_thickness": { "value": "0.8" }, "top_bottom_thickness": { "default_value": 0.3 }, "retraction_enable": { "default_value": true }, "retraction_speed": { "default_value": 50 }, diff --git a/resources/definitions/peopoly_moai.def.json b/resources/definitions/peopoly_moai.def.json index 8d7754a9ef..119d52c201 100644 --- a/resources/definitions/peopoly_moai.def.json +++ b/resources/definitions/peopoly_moai.def.json @@ -189,7 +189,7 @@ "value": "machine_nozzle_size / 3" }, "wall_thickness": { - "value": 0.5 + "value": "0.5" }, "infill_sparse_density": { "value": 70 diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json index d6fb4f1651..f20ce1b7ec 100644 --- a/resources/definitions/rigidbot.def.json +++ b/resources/definitions/rigidbot.def.json @@ -44,7 +44,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 0.8 + "value": "0.8" }, "top_bottom_thickness": { "default_value": 0.3 diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json index 9568417acc..fcd187706c 100644 --- a/resources/definitions/rigidbot_big.def.json +++ b/resources/definitions/rigidbot_big.def.json @@ -44,7 +44,7 @@ "default_value": 0.2 }, "wall_thickness": { - "default_value": 0.8 + "value": "0.8" }, "top_bottom_thickness": { "default_value": 0.3 diff --git a/resources/definitions/robo_3d_r1.def.json b/resources/definitions/robo_3d_r1.def.json index 36b8addd27..e72b0a2688 100644 --- a/resources/definitions/robo_3d_r1.def.json +++ b/resources/definitions/robo_3d_r1.def.json @@ -31,7 +31,7 @@ "layer_height_0": { "default_value": 0.15 }, "material_flow": { "default_value": 100 }, "infill_sparse_density": { "default_value": 10 }, - "wall_thickness": { "default_value": 1.2 }, + "wall_thickness": { "value": "1.2" }, "retraction_amount": { "default_value": 3 }, "layer_height": { "default_value": 0.2 }, "speed_print": { "default_value": 40 }, diff --git a/resources/definitions/skriware_2.def.json b/resources/definitions/skriware_2.def.json index ad717d774c..4534ea0350 100644 --- a/resources/definitions/skriware_2.def.json +++ b/resources/definitions/skriware_2.def.json @@ -322,7 +322,7 @@ "default_value": 2 }, "wall_thickness": { - "default_value": 1.2 + "value": "1.2" }, "support_infill_sparse_thickness": { "value": "resolveOrValue('layer_height')" diff --git a/resources/definitions/tam.def.json b/resources/definitions/tam.def.json index 0bc68f321a..940e8c6fa0 100644 --- a/resources/definitions/tam.def.json +++ b/resources/definitions/tam.def.json @@ -21,7 +21,7 @@ "layer_height": { "default_value": 0.2 }, "layer_height_0": { "default_value": 0.3 }, "infill_sparse_density": { "default_value": 5 }, - "wall_thickness": { "default_value": 1 }, + "wall_thickness": { "value": "1" }, "top_bottom_thickness": { "default_value": 1 }, "infill_pattern": { "value": "'tetrahedral'" }, diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json index c92476da49..71646d76ee 100644 --- a/resources/definitions/vertex_delta_k8800.def.json +++ b/resources/definitions/vertex_delta_k8800.def.json @@ -49,7 +49,7 @@ "value": 0.35 }, "wall_thickness": { - "value": 0.7 + "value": "0.7" }, "top_bottom_thickness": { "value": 0.6 diff --git a/resources/definitions/vertex_nano_k8600.def.json b/resources/definitions/vertex_nano_k8600.def.json index ef9552caf3..9f7b9d2cb7 100644 --- a/resources/definitions/vertex_nano_k8600.def.json +++ b/resources/definitions/vertex_nano_k8600.def.json @@ -47,7 +47,7 @@ "value": 0.35 }, "wall_thickness": { - "value": 0.7 + "value": "0.7" }, "top_bottom_thickness": { "value": 0.6 diff --git a/resources/extruders/fabxpro_extruder_0.def.json b/resources/extruders/fabxpro_extruder_0.def.json new file mode 100644 index 0000000000..761aebe287 --- /dev/null +++ b/resources/extruders/fabxpro_extruder_0.def.json @@ -0,0 +1,15 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "fabxpro", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} diff --git a/resources/i18n/hu_HU/cura.po b/resources/i18n/hu_HU/cura.po index bedd8169f5..e93ca36d77 100644 --- a/resources/i18n/hu_HU/cura.po +++ b/resources/i18n/hu_HU/cura.po @@ -3599,7 +3599,7 @@ msgstr "&Fájl" #: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:31 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" -msgstr "&Szerkesztés" +msgstr "S&zerkesztés" #: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:48 #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 @@ -4424,7 +4424,7 @@ msgstr "Anyagok kezelése..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" -msgstr "&Profil frissítése a jelenlegi beállításokkal/felülírásokkal" +msgstr "Profil &frissítése a jelenlegi beállításokkal/felülírásokkal" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203 msgctxt "@action:inmenu menubar:profile" @@ -4434,7 +4434,7 @@ msgstr "&Jelenlegi változtatások eldobása" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." -msgstr "&Profil létrehozása a jelenlegi beállításokkal/felülírásokkal..." +msgstr "Profil &létrehozása a jelenlegi beállításokkal/felülírásokkal..." #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221 msgctxt "@action:inmenu menubar:profile" diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_ABS_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_ABS_Fast_Print_Accurate.inst.cfg index a1d50aae0f..5ab984c5cb 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_ABS_Fast_Print_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_ABS_Fast_Print_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_ABS_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_ABS_Normal_Quality_Accurate.inst.cfg index 26c5029924..3e749af40a 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_ABS_Normal_Quality_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_ABS_Normal_Quality_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print_Accurate.inst.cfg new file mode 100644 index 0000000000..55e6b20baa --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s3 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = fast +material = generic_cpe_plus +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality_Accurate.inst.cfg new file mode 100644 index 0000000000..0ed112b06e --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s3 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = normal +material = generic_cpe_plus +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print_Accurate.inst.cfg new file mode 100644 index 0000000000..636ddd0e49 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s3 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = fast +material = generic_cpe +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality_Accurate.inst.cfg new file mode 100644 index 0000000000..66d79d502a --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s3 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = normal +material = generic_cpe +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_Nylon_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_Nylon_Fast_Print_Accurate.inst.cfg new file mode 100644 index 0000000000..cb99ddc0ea --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_Nylon_Fast_Print_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s3 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = fast +material = generic_nylon +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_Nylon_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_Nylon_Normal_Quality_Accurate.inst.cfg new file mode 100644 index 0000000000..d207ace74b --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_Nylon_Normal_Quality_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s3 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = normal +material = generic_nylon +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_PC_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_PC_Fast_Print_Accurate.inst.cfg new file mode 100644 index 0000000000..44fedf583f --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_PC_Fast_Print_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s3 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = fast +material = generic_pc +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_PC_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_PC_Normal_Quality_Accurate.inst.cfg new file mode 100644 index 0000000000..d926bb1fe4 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_PC_Normal_Quality_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s3 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = normal +material = generic_pc +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_PLA_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_PLA_Fast_Print_Accurate.inst.cfg index 63aa092cf1..4a5b4ebb95 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_PLA_Fast_Print_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_PLA_Fast_Print_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_PLA_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_PLA_Normal_Quality_Accurate.inst.cfg index 82fe5e807b..dc5f97058c 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_PLA_Normal_Quality_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_PLA_Normal_Quality_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_TPLA_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_TPLA_Fast_Print_Accurate.inst.cfg index 865c53e4e8..ad66d8e286 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_TPLA_Fast_Print_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_TPLA_Fast_Print_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_TPLA_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_TPLA_Normal_Quality_Accurate.inst.cfg index 36150f18a3..7b62ff3d06 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_TPLA_Normal_Quality_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_TPLA_Normal_Quality_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_ABS_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_ABS_Fast_Print_Accurate.inst.cfg index 6aed5bf11a..9ca5c61b21 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_ABS_Fast_Print_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_ABS_Fast_Print_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_ABS_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_ABS_Normal_Quality_Accurate.inst.cfg index a141830f80..8e586aff25 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_ABS_Normal_Quality_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_ABS_Normal_Quality_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_CPEP_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_CPEP_Fast_Print_Accurate.inst.cfg new file mode 100644 index 0000000000..e30d7af95c --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_CPEP_Fast_Print_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s5 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = fast +material = generic_cpe_plus +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_CPEP_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_CPEP_Normal_Quality_Accurate.inst.cfg new file mode 100644 index 0000000000..9df0cad0df --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_CPEP_Normal_Quality_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s5 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = normal +material = generic_cpe_plus +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_CPE_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_CPE_Fast_Print_Accurate.inst.cfg new file mode 100644 index 0000000000..9f9e58068a --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_CPE_Fast_Print_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s5 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = fast +material = generic_cpe +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_CPE_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_CPE_Normal_Quality_Accurate.inst.cfg new file mode 100644 index 0000000000..02ffa379fb --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_CPE_Normal_Quality_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s5 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = normal +material = generic_cpe +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_Nylon_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_Nylon_Fast_Print_Accurate.inst.cfg new file mode 100644 index 0000000000..9149be0de7 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_Nylon_Fast_Print_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s5 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = fast +material = generic_nylon +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_Nylon_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_Nylon_Normal_Quality_Accurate.inst.cfg new file mode 100644 index 0000000000..21bfa697f2 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_Nylon_Normal_Quality_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s5 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = normal +material = generic_nylon +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_PC_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_PC_Fast_Print_Accurate.inst.cfg new file mode 100644 index 0000000000..6abfaddc7b --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_PC_Fast_Print_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s5 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = fast +material = generic_pc +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_PC_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_PC_Normal_Quality_Accurate.inst.cfg new file mode 100644 index 0000000000..9845dadf28 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_PC_Normal_Quality_Accurate.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Accurate +definition = ultimaker_s5 + +[metadata] +setting_version = 11 +type = intent +intent_category = engineering +quality_type = normal +material = generic_pc +variant = AA 0.4 + +[values] +infill_line_width = =line_width +jerk_print = 30 +jerk_infill = =jerk_print +jerk_topbottom = =jerk_print +jerk_wall = =jerk_print +jerk_wall_0 = =jerk_wall +jerk_wall_x = =jerk_wall +jerk_layer_0 = 5 +line_width = =machine_nozzle_size +speed_print = 30 +speed_infill = =speed_print +speed_layer_0 = 20 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 +xy_offset = =-layer_height * 0.2 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_PLA_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_PLA_Fast_Print_Accurate.inst.cfg index d814866d39..8fcc2c128a 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_PLA_Fast_Print_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_PLA_Fast_Print_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_PLA_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_PLA_Normal_Quality_Accurate.inst.cfg index b22b6ff4c2..f987eed58a 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_PLA_Normal_Quality_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_PLA_Normal_Quality_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_TPLA_Fast_Print_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_TPLA_Fast_Print_Accurate.inst.cfg index 57ab6a727e..abe0e598f4 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_TPLA_Fast_Print_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_TPLA_Fast_Print_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_TPLA_Normal_Quality_Accurate.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_TPLA_Normal_Quality_Accurate.inst.cfg index a5f878bf4f..72ad6e61f7 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_TPLA_Normal_Quality_Accurate.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_TPLA_Normal_Quality_Accurate.inst.cfg @@ -31,4 +31,4 @@ speed_wall_x = =speed_wall top_bottom_thickness = =wall_thickness wall_line_width_x = =line_width wall_thickness = =line_width * 3 -xy_offset = =- layer_height * 0.2 +xy_offset = =-layer_height * 0.2 diff --git a/resources/meshes/fabxpro_platform.STL b/resources/meshes/fabxpro_platform.STL new file mode 100644 index 0000000000..f0fd3a2a80 Binary files /dev/null and b/resources/meshes/fabxpro_platform.STL differ diff --git a/resources/qml/Account/GeneralOperations.qml b/resources/qml/Account/GeneralOperations.qml index f01b9538bd..bea90c1d67 100644 --- a/resources/qml/Account/GeneralOperations.qml +++ b/resources/qml/Account/GeneralOperations.qml @@ -26,7 +26,7 @@ Column anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Text.AlignHCenter renderType: Text.NativeRendering - text: "Ultimaker Cloud" + text: "Ultimaker Account" font: UM.Theme.getFont("large_bold") color: UM.Theme.getColor("text") } @@ -37,7 +37,7 @@ Column anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Text.AlignHCenter renderType: Text.NativeRendering - text: catalog.i18nc("@label", "The next generation 3D printing workflow") + text: catalog.i18nc("@label", "Your key to connected 3D printing") font: UM.Theme.getFont("default_bold") color: UM.Theme.getColor("text") } @@ -48,7 +48,7 @@ Column anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Text.AlignLeft renderType: Text.NativeRendering - text: catalog.i18nc("@text", "- Send print jobs to Ultimaker printers outside your local network\n- Store your Ultimaker Cura settings in the cloud for use anywhere\n- Get exclusive access to print profiles from leading brands") + text: catalog.i18nc("@text", "- Customize your experience with more print profiles and plugins\n- Stay flexible by syncing your setup and loading it anywhere\n- Increase efficiency with a remote workflow on Ultimaker printers") lineHeight: 1.4 font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") diff --git a/resources/qml/WelcomePages/CloudContent.qml b/resources/qml/WelcomePages/CloudContent.qml index e9b6df94e0..b127dbfb3c 100644 --- a/resources/qml/WelcomePages/CloudContent.qml +++ b/resources/qml/WelcomePages/CloudContent.qml @@ -33,7 +33,7 @@ Item anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Text.AlignHCenter - text: catalog.i18nc("@label", "Ultimaker Cloud") + text: catalog.i18nc("@label", "Ultimaker Account") color: UM.Theme.getColor("primary_button") font: UM.Theme.getFont("huge") renderType: Text.NativeRendering @@ -74,7 +74,7 @@ Item id: highlightTextLabel anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: Text.AlignHCenter - text: catalog.i18nc("@text", "The next generation 3D printing workflow") + text: catalog.i18nc("@text", "Your key to connected 3D printing") textFormat: Text.RichText color: UM.Theme.getColor("primary") font: UM.Theme.getFont("medium") @@ -91,13 +91,13 @@ Item var full_text = "" var t = "" - t = catalog.i18nc("@text", "- Send print jobs to Ultimaker printers outside your local network") + t = catalog.i18nc("@text", "- Customize your experience with more print profiles and plugins") full_text += "

" + t + "

" - t = catalog.i18nc("@text", "- Store your Ultimaker Cura settings in the cloud for use anywhere") + t = catalog.i18nc("@text", "- Stay flexible by syncing your setup and loading it anywhere") full_text += "

" + t + "

" - t = catalog.i18nc("@text", "- Get exclusive access to print profiles from leading brands") + t = catalog.i18nc("@text", "- Increase efficiency with a remote workflow on Ultimaker printers") full_text += "

" + t + "

" return full_text diff --git a/resources/quality/fabxpro/fabxpro_abs_draft.inst.cfg b/resources/quality/fabxpro/fabxpro_abs_draft.inst.cfg new file mode 100644 index 0000000000..229e3ba587 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_abs_draft.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Draft +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Draft +weight = -2 +material = redd_abs +global_quality = True + + +[values] +layer_height = 0.3 +layer_height_0 = 0.35 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_abs_fine.inst.cfg b/resources/quality/fabxpro/fabxpro_abs_fine.inst.cfg new file mode 100644 index 0000000000..298a8f6eb7 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_abs_fine.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Fine +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Fine +weight = -2 +material = redd_abs +global_quality = True + +[values] +layer_height = 0.1 +layer_height_0 = 0.15 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_abs_normal.inst.cfg b/resources/quality/fabxpro/fabxpro_abs_normal.inst.cfg new file mode 100644 index 0000000000..6ee74f26e4 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_abs_normal.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Normal +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Normal +weight = -2 +material = redd_abs +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_asa_draft.inst.cfg b/resources/quality/fabxpro/fabxpro_asa_draft.inst.cfg new file mode 100644 index 0000000000..ef5bfe1ab8 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_asa_draft.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Draft +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Draft +weight = -2 +material = redd_asa +global_quality = True + + +[values] +layer_height = 0.3 +layer_height_0 = 0.35 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_asa_fine.inst.cfg b/resources/quality/fabxpro/fabxpro_asa_fine.inst.cfg new file mode 100644 index 0000000000..9fb8243fba --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_asa_fine.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Fine +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Fine +weight = -2 +material = redd_asa +global_quality = True + +[values] +layer_height = 0.1 +layer_height_0 = 0.15 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 + diff --git a/resources/quality/fabxpro/fabxpro_asa_normal.inst.cfg b/resources/quality/fabxpro/fabxpro_asa_normal.inst.cfg new file mode 100644 index 0000000000..3c4da49bc9 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_asa_normal.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Normal +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Normal +weight = -2 +material = redd_asa +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 \ No newline at end of file diff --git a/resources/quality/fabxpro/fabxpro_hips_draft.inst.cfg b/resources/quality/fabxpro/fabxpro_hips_draft.inst.cfg new file mode 100644 index 0000000000..c2831c8bd4 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_hips_draft.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Draft +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Draft +weight = -2 +material = redd_hips +global_quality = True + + +[values] +layer_height = 0.3 +layer_height_0 = 0.35 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_hips_fine.inst.cfg b/resources/quality/fabxpro/fabxpro_hips_fine.inst.cfg new file mode 100644 index 0000000000..fd06f2d051 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_hips_fine.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Fine +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Fine +weight = -2 +material = redd_hips +global_quality = True + +[values] +layer_height = 0.1 +layer_height_0 = 0.15 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 + diff --git a/resources/quality/fabxpro/fabxpro_hips_normal.inst.cfg b/resources/quality/fabxpro/fabxpro_hips_normal.inst.cfg new file mode 100644 index 0000000000..b961438594 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_hips_normal.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Normal +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Normal +weight = -2 +material = redd_hips +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 \ No newline at end of file diff --git a/resources/quality/fabxpro/fabxpro_nylon_draft.inst.cfg b/resources/quality/fabxpro/fabxpro_nylon_draft.inst.cfg new file mode 100644 index 0000000000..ccc8858ed6 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_nylon_draft.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Draft +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Draft +weight = -2 +material = redd_nylon +global_quality = True + + +[values] +layer_height = 0.3 +layer_height_0 = 0.35 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_nylon_fine.inst.cfg b/resources/quality/fabxpro/fabxpro_nylon_fine.inst.cfg new file mode 100644 index 0000000000..34df2f3228 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_nylon_fine.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Fine +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Fine +weight = -2 +material = redd_nylon +global_quality = True + +[values] +layer_height = 0.1 +layer_height_0 = 0.15 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 + diff --git a/resources/quality/fabxpro/fabxpro_nylon_normal.inst.cfg b/resources/quality/fabxpro/fabxpro_nylon_normal.inst.cfg new file mode 100644 index 0000000000..b34c6407ad --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_nylon_normal.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Normal +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Normal +weight = -2 +material = redd_nylon +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 \ No newline at end of file diff --git a/resources/quality/fabxpro/fabxpro_petg_draft.inst.cfg b/resources/quality/fabxpro/fabxpro_petg_draft.inst.cfg new file mode 100644 index 0000000000..243a01924b --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_petg_draft.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Draft +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Draft +weight = -2 +material = redd_petg +global_quality = True + + +[values] +layer_height = 0.3 +layer_height_0 = 0.35 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_petg_fine.inst.cfg b/resources/quality/fabxpro/fabxpro_petg_fine.inst.cfg new file mode 100644 index 0000000000..4c3329dfba --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_petg_fine.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Fine +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Fine +weight = -2 +material = redd_petg +global_quality = True + +[values] +layer_height = 0.1 +layer_height_0 = 0.15 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 + diff --git a/resources/quality/fabxpro/fabxpro_petg_normal.inst.cfg b/resources/quality/fabxpro/fabxpro_petg_normal.inst.cfg new file mode 100644 index 0000000000..251dafc125 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_petg_normal.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Normal +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Normal +weight = -2 +material = redd_petg +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 \ No newline at end of file diff --git a/resources/quality/fabxpro/fabxpro_pla_draft.inst.cfg b/resources/quality/fabxpro/fabxpro_pla_draft.inst.cfg new file mode 100644 index 0000000000..c8ef3215ba --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_pla_draft.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Draft +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Draft +weight = -2 +material = redd_pla +global_quality = True + +[values] +layer_height = 0.3 +layer_height_0 = 0.35 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = skirt +cool_fan_enabled = true +cool_fan_speed = 100 +cool_fan_full_at_height = 0.6 +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_pla_fine.inst.cfg b/resources/quality/fabxpro/fabxpro_pla_fine.inst.cfg new file mode 100644 index 0000000000..8e2a07bf4b --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_pla_fine.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Fine +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Fine +weight = -2 +material = redd_pla +global_quality = True + +[values] +layer_height = 0.1 +layer_height_0 = 0.15 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = skirt +cool_fan_enabled = true +cool_fan_speed = 100 +cool_fan_full_at_height = 0.6 +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_pla_normal.inst.cfg b/resources/quality/fabxpro/fabxpro_pla_normal.inst.cfg new file mode 100644 index 0000000000..2f5228ddd1 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_pla_normal.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Normal +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Normal +weight = -2 +material = redd_pla +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 55 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = skirt +cool_fan_enabled = true +cool_fan_speed = 100 +cool_fan_full_at_height = 0.6 +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_tpe_draft.inst.cfg b/resources/quality/fabxpro/fabxpro_tpe_draft.inst.cfg new file mode 100644 index 0000000000..2e2a3b6830 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_tpe_draft.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Draft +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Draft +weight = -2 +material = redd_tpe +global_quality = True + + +[values] +layer_height = 0.3 +layer_height_0 = 0.35 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 35 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 diff --git a/resources/quality/fabxpro/fabxpro_tpe_fine.inst.cfg b/resources/quality/fabxpro/fabxpro_tpe_fine.inst.cfg new file mode 100644 index 0000000000..bd4821762a --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_tpe_fine.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Fine +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Fine +weight = -2 +material = redd_tpe +global_quality = True + +[values] +layer_height = 0.1 +layer_height_0 = 0.15 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 35 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 + diff --git a/resources/quality/fabxpro/fabxpro_tpe_normal.inst.cfg b/resources/quality/fabxpro/fabxpro_tpe_normal.inst.cfg new file mode 100644 index 0000000000..dcae187831 --- /dev/null +++ b/resources/quality/fabxpro/fabxpro_tpe_normal.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Normal +definition = fabxpro + +[metadata] +setting_version = 11 +type = quality +quality_type = Normal +weight = -2 +material = redd_tpe +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.3 +initial_layer_line_width_factor = 150 +infill_before_walls = False +speed_print = 35 +speed_travel = 70 +retraction_amount = 1 +retraction_speed = 40 +adhesion_type = raft +raft_margin = 5 +raft_airgap = 0.35 +raft_surface_layers = 1 +raft_surface_thickness = 0.1 +raft_surface_line_spacing = 0.6 +raft_base_thickness = 0.6 +cool_fan_enabled = False +support_enable = True +support_pattern = lines +support_infill_rate = 15 +support_z_distance = 0.15 +support_xy_distance = 0.85 \ No newline at end of file