mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 06:45:57 +08:00
Merge branch 'master' into ppscript_pre_secure
This commit is contained in:
commit
6bf00d7ea1
1
.gitignore
vendored
1
.gitignore
vendored
@ -53,6 +53,7 @@ plugins/GodMode
|
||||
plugins/OctoPrintPlugin
|
||||
plugins/ProfileFlattener
|
||||
plugins/SettingsGuide
|
||||
plugins/SVGToolpathReader
|
||||
plugins/X3GWriter
|
||||
|
||||
#Build stuff
|
||||
|
@ -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
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
from typing import List, Optional
|
||||
|
||||
@ -30,7 +30,7 @@ LocationSuggestion = namedtuple("LocationSuggestion", ["x", "y", "penalty_points
|
||||
class Arrange:
|
||||
build_volume = None # type: Optional[BuildVolume]
|
||||
|
||||
def __init__(self, x, y, offset_x, offset_y, scale= 0.5):
|
||||
def __init__(self, x, y, offset_x, offset_y, scale = 0.5):
|
||||
self._scale = scale # convert input coordinates to arrange coordinates
|
||||
world_x, world_y = int(x * self._scale), int(y * self._scale)
|
||||
self._shape = (world_y, world_x)
|
||||
|
@ -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
|
||||
|
@ -239,6 +239,8 @@ class ContainerManager(QObject):
|
||||
container_type = container_registry.getContainerForMimeType(mime_type)
|
||||
if not container_type:
|
||||
return {"status": "error", "message": "Could not find a container to handle the specified file."}
|
||||
if not issubclass(container_type, InstanceContainer):
|
||||
return {"status": "error", "message": "This is not a material container, but another type of file."}
|
||||
|
||||
container_id = urllib.parse.unquote_plus(mime_type.stripExtension(os.path.basename(file_url)))
|
||||
container_id = container_registry.uniqueName(container_id)
|
||||
|
@ -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)
|
0
cura/UltimakerCloud/__init__.py
Normal file
0
cura/UltimakerCloud/__init__.py
Normal file
@ -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()
|
||||
|
@ -285,13 +285,13 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
||||
serialized = archive.open(instance_container_file_name).read().decode("utf-8")
|
||||
|
||||
# Qualities and variants don't have upgrades, so don't upgrade them
|
||||
parser = ConfigParser(interpolation = None)
|
||||
parser = ConfigParser(interpolation = None, comment_prefixes = ())
|
||||
parser.read_string(serialized)
|
||||
container_type = parser["metadata"]["type"]
|
||||
if container_type not in ("quality", "variant"):
|
||||
serialized = InstanceContainer._updateSerialized(serialized, instance_container_file_name)
|
||||
|
||||
parser = ConfigParser(interpolation = None)
|
||||
parser = ConfigParser(interpolation = None, comment_prefixes = ())
|
||||
parser.read_string(serialized)
|
||||
container_info = ContainerInfo(instance_container_file_name, serialized, parser)
|
||||
instance_container_info_dict[container_id] = container_info
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import configparser
|
||||
@ -6,6 +6,7 @@ from io import StringIO
|
||||
import zipfile
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.Logger import Logger
|
||||
from UM.Preferences import Preferences
|
||||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||
from UM.Workspace.WorkspaceWriter import WorkspaceWriter
|
||||
@ -25,6 +26,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter):
|
||||
mesh_writer = application.getMeshFileHandler().getWriter("3MFWriter")
|
||||
|
||||
if not mesh_writer: # We need to have the 3mf mesh writer, otherwise we can't save the entire workspace
|
||||
Logger.error("3MF Writer class is unavailable. Can't write workspace.")
|
||||
return False
|
||||
|
||||
# Indicate that the 3mf mesh writer should not close the archive just yet (we still need to add stuff to it).
|
||||
@ -59,24 +61,28 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter):
|
||||
preferences_string = StringIO()
|
||||
temp_preferences.writeToFile(preferences_string)
|
||||
preferences_file = zipfile.ZipInfo("Cura/preferences.cfg")
|
||||
archive.writestr(preferences_file, preferences_string.getvalue())
|
||||
try:
|
||||
archive.writestr(preferences_file, preferences_string.getvalue())
|
||||
|
||||
# Save Cura version
|
||||
version_file = zipfile.ZipInfo("Cura/version.ini")
|
||||
version_config_parser = configparser.ConfigParser(interpolation = None)
|
||||
version_config_parser.add_section("versions")
|
||||
version_config_parser.set("versions", "cura_version", application.getVersion())
|
||||
version_config_parser.set("versions", "build_type", application.getBuildType())
|
||||
version_config_parser.set("versions", "is_debug_mode", str(application.getIsDebugMode()))
|
||||
# Save Cura version
|
||||
version_file = zipfile.ZipInfo("Cura/version.ini")
|
||||
version_config_parser = configparser.ConfigParser(interpolation = None)
|
||||
version_config_parser.add_section("versions")
|
||||
version_config_parser.set("versions", "cura_version", application.getVersion())
|
||||
version_config_parser.set("versions", "build_type", application.getBuildType())
|
||||
version_config_parser.set("versions", "is_debug_mode", str(application.getIsDebugMode()))
|
||||
|
||||
version_file_string = StringIO()
|
||||
version_config_parser.write(version_file_string)
|
||||
archive.writestr(version_file, version_file_string.getvalue())
|
||||
version_file_string = StringIO()
|
||||
version_config_parser.write(version_file_string)
|
||||
archive.writestr(version_file, version_file_string.getvalue())
|
||||
|
||||
self._writePluginMetadataToArchive(archive)
|
||||
self._writePluginMetadataToArchive(archive)
|
||||
|
||||
# Close the archive & reset states.
|
||||
archive.close()
|
||||
# Close the archive & reset states.
|
||||
archive.close()
|
||||
except PermissionError:
|
||||
Logger.error("No permission to write workspace to this stream.")
|
||||
return False
|
||||
mesh_writer.setStoreArchive(False)
|
||||
return True
|
||||
|
||||
|
119
plugins/CuraDrive/src/CreateBackupJob.py
Normal file
119
plugins/CuraDrive/src/CreateBackupJob.py
Normal file
@ -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()
|
@ -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))
|
||||
|
@ -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()
|
||||
|
92
plugins/CuraDrive/src/RestoreBackupJob.py
Normal file
92
plugins/CuraDrive/src/RestoreBackupJob.py
Normal file
@ -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
|
@ -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:
|
||||
|
@ -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)
|
@ -107,7 +107,7 @@ Item
|
||||
labelWidth: base.labelWidth
|
||||
controlWidth: base.controlWidth
|
||||
unitText: catalog.i18nc("@label", "mm")
|
||||
allowNegativeValue: true
|
||||
minimum: Number.NEGATIVE_INFINITY
|
||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||
}
|
||||
|
||||
@ -122,7 +122,7 @@ Item
|
||||
labelWidth: base.labelWidth
|
||||
controlWidth: base.controlWidth
|
||||
unitText: catalog.i18nc("@label", "mm")
|
||||
allowNegativeValue: true
|
||||
minimum: Number.NEGATIVE_INFINITY
|
||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||
}
|
||||
|
||||
|
@ -72,6 +72,7 @@ Item
|
||||
labelWidth: base.labelWidth
|
||||
controlWidth: base.controlWidth
|
||||
unitText: catalog.i18nc("@label", "mm")
|
||||
maximum: 2000000
|
||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||
}
|
||||
|
||||
@ -86,6 +87,7 @@ Item
|
||||
labelWidth: base.labelWidth
|
||||
controlWidth: base.controlWidth
|
||||
unitText: catalog.i18nc("@label", "mm")
|
||||
maximum: 2000000
|
||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||
}
|
||||
|
||||
@ -204,8 +206,8 @@ Item
|
||||
|
||||
axisName: "x"
|
||||
axisMinOrMax: "min"
|
||||
allowNegativeValue: true
|
||||
allowPositiveValue: false
|
||||
minimum: Number.NEGATIVE_INFINITY
|
||||
maximum: 0
|
||||
|
||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||
}
|
||||
@ -224,8 +226,8 @@ Item
|
||||
|
||||
axisName: "y"
|
||||
axisMinOrMax: "min"
|
||||
allowNegativeValue: true
|
||||
allowPositiveValue: false
|
||||
minimum: Number.NEGATIVE_INFINITY
|
||||
maximum: 0
|
||||
|
||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||
}
|
||||
@ -244,8 +246,6 @@ Item
|
||||
|
||||
axisName: "x"
|
||||
axisMinOrMax: "max"
|
||||
allowNegativeValue: false
|
||||
allowPositiveValue: true
|
||||
|
||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||
}
|
||||
@ -266,8 +266,6 @@ Item
|
||||
|
||||
axisName: "y"
|
||||
axisMinOrMax: "max"
|
||||
allowNegativeValue: false
|
||||
allowPositiveValue: true
|
||||
|
||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2019 Ultimaker B.V.
|
||||
//Copyright (c) 2020 Ultimaker B.V.
|
||||
//Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import QtQuick 2.4
|
||||
|
@ -1,6 +1,7 @@
|
||||
from typing import Union
|
||||
|
||||
from cura import ApplicationMetadata, UltimakerCloudAuthentication
|
||||
from cura import ApplicationMetadata
|
||||
from cura.UltimakerCloud import UltimakerCloudAuthentication
|
||||
|
||||
|
||||
class CloudApiModel:
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
self.discrepancies.emit(self._model)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -44,7 +44,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1
|
||||
"value": "1"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1
|
||||
|
@ -44,7 +44,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1
|
||||
"value": "1"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1
|
||||
|
@ -44,7 +44,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1
|
||||
"value": "1"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1
|
||||
|
@ -51,7 +51,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"speed_print": {
|
||||
"default_value": 40
|
||||
|
@ -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 },
|
||||
|
@ -49,7 +49,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1
|
||||
"value": "1"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1
|
||||
|
@ -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 },
|
||||
|
@ -48,7 +48,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1
|
||||
"value": "1"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1
|
||||
|
@ -49,7 +49,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1
|
||||
"value": "1"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1
|
||||
|
@ -48,7 +48,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1.2
|
||||
|
@ -54,7 +54,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 0.6
|
||||
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
@ -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" },
|
||||
|
@ -3,7 +3,7 @@
|
||||
"version": 2,
|
||||
"inherits": "fdmprinter",
|
||||
"metadata": {
|
||||
"visible": true,
|
||||
"visible": false,
|
||||
"author": "Ultimaker",
|
||||
"manufacturer": "Custom",
|
||||
"file_formats": "text/x-gcode",
|
||||
|
@ -44,7 +44,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1
|
||||
"value": "1"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1
|
||||
|
58
resources/definitions/fabxpro.def.json
Normal file
58
resources/definitions/fabxpro.def.json
Normal file
@ -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'"
|
||||
}
|
||||
}
|
||||
}
|
@ -75,7 +75,7 @@
|
||||
"material_guid":
|
||||
{
|
||||
"label": "Material GUID",
|
||||
"description": "GUID of the material. This is set automatically. ",
|
||||
"description": "GUID of the material. This is set automatically.",
|
||||
"default_value": "",
|
||||
"type": "str",
|
||||
"enabled": false
|
||||
@ -142,6 +142,8 @@
|
||||
"description": "The width (X-direction) of the printable area.",
|
||||
"default_value": 100,
|
||||
"type": "float",
|
||||
"minimum_value": "0.001",
|
||||
"maximum_value": "2000000",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
@ -152,6 +154,8 @@
|
||||
"description": "The depth (Y-direction) of the printable area.",
|
||||
"default_value": 100,
|
||||
"type": "float",
|
||||
"minimum_value": "0.001",
|
||||
"maximum_value": "2000000",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
@ -1028,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",
|
||||
@ -3638,7 +3643,7 @@
|
||||
"retraction_enable":
|
||||
{
|
||||
"label": "Enable Retraction",
|
||||
"description": "Retract the filament when the nozzle is moving over a non-printed area. ",
|
||||
"description": "Retract the filament when the nozzle is moving over a non-printed area.",
|
||||
"type": "bool",
|
||||
"default_value": true,
|
||||
"settable_per_mesh": false,
|
||||
@ -4434,7 +4439,7 @@
|
||||
"support_xy_distance_overhang":
|
||||
{
|
||||
"label": "Minimum Support X/Y Distance",
|
||||
"description": "Distance of the support structure from the overhang in the X/Y directions. ",
|
||||
"description": "Distance of the support structure from the overhang in the X/Y directions.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"minimum_value": "0",
|
||||
@ -5878,7 +5883,7 @@
|
||||
"label": "Mesh Fixes",
|
||||
"type": "category",
|
||||
"icon": "category_fixes",
|
||||
"description": "category_fixes",
|
||||
"description": "Make the meshes more suited for 3D printing.",
|
||||
"children":
|
||||
{
|
||||
"meshfix_union_all":
|
||||
@ -6004,7 +6009,7 @@
|
||||
"label": "Special Modes",
|
||||
"type": "category",
|
||||
"icon": "category_blackmagic",
|
||||
"description": "category_blackmagic",
|
||||
"description": "Non-traditional ways to print your models.",
|
||||
"children":
|
||||
{
|
||||
"print_sequence":
|
||||
@ -6177,7 +6182,7 @@
|
||||
"label": "Experimental",
|
||||
"type": "category",
|
||||
"icon": "category_experimental",
|
||||
"description": "experimental!",
|
||||
"description": "Features that haven't completely been fleshed out yet.",
|
||||
"children":
|
||||
{
|
||||
"support_tree_enable":
|
||||
|
@ -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 },
|
||||
|
@ -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'" },
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
@ -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 },
|
||||
|
@ -95,7 +95,7 @@
|
||||
"alternate_extra_perimeter": {"value": false },
|
||||
"filter_out_tiny_gaps": {"value": true },
|
||||
"fill_outline_gaps": {"value": true },
|
||||
"z_seam_type": {"value": "'back'"},
|
||||
"z_seam_type": {"value": "'shortest'"},
|
||||
"z_seam_x": {"value": "300"},
|
||||
"z_seam_y": {"value": "325"},
|
||||
"z_seam_corner": {"value": "'z_seam_corner_inner'"},
|
||||
@ -136,7 +136,7 @@
|
||||
"speed_wall_x": {"value": "speed_wall"},
|
||||
"speed_layer_0": {"value": "(speed_print/5*4) if speed_print > 45 else speed_print"},
|
||||
"speed_topbottom": {"value": "speed_layer_0"},
|
||||
"speed_travel": {"value": "150"},
|
||||
"speed_travel": {"value": "250"},
|
||||
"speed_travel_layer_0": {"value": "speed_travel"},
|
||||
"speed_support_interface": {"value": "speed_topbottom"},
|
||||
"speed_z_hop": {"value": 10},
|
||||
@ -157,7 +157,8 @@
|
||||
"cool_min_speed": {"value": "5"},
|
||||
"cool_lift_head": {"value": false},
|
||||
|
||||
"support_infill_rate": {"value": 25},
|
||||
"support_pattern": {"value": "'grid'"},
|
||||
"support_infill_rate": {"value": 30},
|
||||
"support_z_distance": {"value": 0},
|
||||
"support_xy_distance": {"value": 0.4},
|
||||
"support_join_distance": {"value": 10},
|
||||
@ -167,7 +168,7 @@
|
||||
"support_interface_height": {"value": "layer_height * 3"},
|
||||
"support_bottom_height": {"value": "layer_height"},
|
||||
|
||||
"adhesion_type": {"value": "'skirt'"},
|
||||
"adhesion_type": {"value": "'brim'"},
|
||||
"skirt_gap": {"value": 1},
|
||||
"skirt_brim_minimal_length": {"value": 50},
|
||||
|
||||
@ -182,7 +183,7 @@
|
||||
"meshfix_maximum_deviation": {"value": 0.01 },
|
||||
|
||||
"minimum_polygon_circumference": {"value": 0.05 },
|
||||
"coasting_enable": {"value": true},
|
||||
"coasting_enable": {"value": false},
|
||||
"coasting_volume": {"value": 0.1},
|
||||
"coasting_min_volume": {"value": 0.17},
|
||||
"coasting_speed": {"value": 90},
|
||||
|
@ -56,7 +56,7 @@
|
||||
"default_value": 0.15
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 0.8
|
||||
"value": "0.8"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 1.2
|
||||
|
@ -51,7 +51,7 @@
|
||||
"default_value": 0.12
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"speed_print": {
|
||||
"default_value": 40
|
||||
|
@ -51,7 +51,7 @@
|
||||
"default_value": 0.12
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"speed_print": {
|
||||
"default_value": 35
|
||||
|
@ -53,7 +53,7 @@
|
||||
"default_value": 0.12
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"speed_print": {
|
||||
"default_value": 40
|
||||
|
@ -51,7 +51,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"speed_print": {
|
||||
"default_value": 60
|
||||
|
@ -51,7 +51,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"speed_print": {
|
||||
"default_value": 60
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 },
|
||||
|
@ -189,7 +189,7 @@
|
||||
"value": "machine_nozzle_size / 3"
|
||||
},
|
||||
"wall_thickness": {
|
||||
"value": 0.5
|
||||
"value": "0.5"
|
||||
},
|
||||
"infill_sparse_density": {
|
||||
"value": 70
|
||||
|
@ -44,7 +44,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 0.8
|
||||
"value": "0.8"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 0.3
|
||||
|
@ -44,7 +44,7 @@
|
||||
"default_value": 0.2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 0.8
|
||||
"value": "0.8"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"default_value": 0.3
|
||||
|
@ -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 },
|
||||
|
@ -322,7 +322,7 @@
|
||||
"default_value": 2
|
||||
},
|
||||
"wall_thickness": {
|
||||
"default_value": 1.2
|
||||
"value": "1.2"
|
||||
},
|
||||
"support_infill_sparse_thickness": {
|
||||
"value": "resolveOrValue('layer_height')"
|
||||
|
@ -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'" },
|
||||
|
@ -49,7 +49,7 @@
|
||||
"value": 0.35
|
||||
},
|
||||
"wall_thickness": {
|
||||
"value": 0.7
|
||||
"value": "0.7"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"value": 0.6
|
||||
|
@ -47,7 +47,7 @@
|
||||
"value": 0.35
|
||||
},
|
||||
"wall_thickness": {
|
||||
"value": 0.7
|
||||
"value": "0.7"
|
||||
},
|
||||
"top_bottom_thickness": {
|
||||
"value": 0.6
|
||||
|
15
resources/extruders/fabxpro_extruder_0.def.json
Normal file
15
resources/extruders/fabxpro_extruder_0.def.json
Normal file
@ -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 }
|
||||
}
|
||||
}
|
5674
resources/i18n/hu_HU/cura.po
Normal file
5674
resources/i18n/hu_HU/cura.po
Normal file
File diff suppressed because it is too large
Load Diff
254
resources/i18n/hu_HU/fdmextruder.def.json.po
Normal file
254
resources/i18n/hu_HU/fdmextruder.def.json.po
Normal file
@ -0,0 +1,254 @@
|
||||
# Cura
|
||||
# Copyright (C) 2020 Ultimaker B.V.
|
||||
# This file is distributed under the same license as the Cura package.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Cura 4.5\n"
|
||||
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
||||
"POT-Creation-Date: 2019-10-11 21:12+0000\n"
|
||||
"PO-Revision-Date: 2020-03-24 09:27+0100\n"
|
||||
"Last-Translator: Nagy Attila <vokroot@gmail.com>\n"
|
||||
"Language-Team: AT-VLOG\n"
|
||||
"Language: hu_HU\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.2.4\n"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_settings label"
|
||||
msgid "Machine"
|
||||
msgstr "Gép"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_settings description"
|
||||
msgid "Machine specific settings"
|
||||
msgstr "Gép specifikus beállítások"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_nr label"
|
||||
msgid "Extruder"
|
||||
msgstr "Extruder"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_nr description"
|
||||
msgid "The extruder train used for printing. This is used in multi-extrusion."
|
||||
msgstr "A nyomtatáshoz extruder szerelvényt használ. Több extrudernél használatos."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_nozzle_id label"
|
||||
msgid "Nozzle ID"
|
||||
msgstr "Fúvóka ID"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_nozzle_id description"
|
||||
msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"."
|
||||
msgstr "A fúvóka ID az extruder szerelvényben, mint a \"AA 0.4\" and \"BB 0.8\"."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_nozzle_size label"
|
||||
msgid "Nozzle Diameter"
|
||||
msgstr "Fúvóka átmérő"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_nozzle_size description"
|
||||
msgid ""
|
||||
"The inner diameter of the nozzle. Change this setting when using a non-standard "
|
||||
"nozzle size."
|
||||
msgstr ""
|
||||
"A fúvóka belső átmérője. Akkor változtasd meg ezt az értéket, ha nem szabványos "
|
||||
"méretű fúvókát használsz."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_nozzle_offset_x label"
|
||||
msgid "Nozzle X Offset"
|
||||
msgstr "Fúvóka X eltolás"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_nozzle_offset_x description"
|
||||
msgid "The x-coordinate of the offset of the nozzle."
|
||||
msgstr "A fúvóka eltolásának mértéke az X koordináta irányában."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_nozzle_offset_y label"
|
||||
msgid "Nozzle Y Offset"
|
||||
msgstr "Fúvóka Y eltolás"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_nozzle_offset_y description"
|
||||
msgid "The y-coordinate of the offset of the nozzle."
|
||||
msgstr "A fúvóka eltolásának mértéke az Y koordináta irányában."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_code label"
|
||||
msgid "Extruder Start G-Code"
|
||||
msgstr "Kezdő G-Code az extruderhez"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_code description"
|
||||
msgid "Start g-code to execute when switching to this extruder."
|
||||
msgstr "Ez a kezdeti g-code akkor kerül végrehajtásra, ha az extruder bekapcsol."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs label"
|
||||
msgid "Extruder Start Position Absolute"
|
||||
msgstr "Extruder Abszolút Indulási Helyzet"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder starting position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgstr ""
|
||||
"Az extruder abszolút kezdeti helyzete helyett a fej utolsó ismert helyzetét "
|
||||
"használja."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_x label"
|
||||
msgid "Extruder Start Position X"
|
||||
msgstr "Extruder kezdő X helyzet"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_x description"
|
||||
msgid "The x-coordinate of the starting position when turning the extruder on."
|
||||
msgstr "A kezdeti X koordináta, mikor az extrudert bekapcsoljuk."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_y label"
|
||||
msgid "Extruder Start Position Y"
|
||||
msgstr "Extruder kezdő Y helyzete"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_start_pos_y description"
|
||||
msgid "The y-coordinate of the starting position when turning the extruder on."
|
||||
msgstr "A kezdeti Y koordináta, mikor az extrudert bekapcsoljuk."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_code label"
|
||||
msgid "Extruder End G-Code"
|
||||
msgstr "Záró G-Code az extruderhez"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_code description"
|
||||
msgid "End g-code to execute when switching away from this extruder."
|
||||
msgstr "Ez a G-Code akkor kerül végrehajtásra, mikor az extruder kikapcsol."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs label"
|
||||
msgid "Extruder End Position Absolute"
|
||||
msgstr "Extruder abszolút vég pozíció"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_abs description"
|
||||
msgid ""
|
||||
"Make the extruder ending position absolute rather than relative to the last-"
|
||||
"known location of the head."
|
||||
msgstr ""
|
||||
"Legyen az extruder végállása az abszolút helyzet helyett, az utolsó ismert fej "
|
||||
"pozíció."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_x label"
|
||||
msgid "Extruder End Position X"
|
||||
msgstr "Extruder X végállása"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_x description"
|
||||
msgid "The x-coordinate of the ending position when turning the extruder off."
|
||||
msgstr "A befejező X koordináta, mikor az extruder kikapcsol."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_y label"
|
||||
msgid "Extruder End Position Y"
|
||||
msgstr "Extruder Y végállása"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_end_pos_y description"
|
||||
msgid "The y-coordinate of the ending position when turning the extruder off."
|
||||
msgstr "A befejező Y koordináta, mikor az extruder kikapcsol."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z label"
|
||||
msgid "Extruder Prime Z Position"
|
||||
msgstr "Az extruder Elsődleges Z Pozíciója"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_z description"
|
||||
msgid ""
|
||||
"The Z coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgstr "Az az elsődleges Z helyzet, ahol a fúvóka a nyomtatást kezdi."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_cooling_fan_number label"
|
||||
msgid "Extruder Print Cooling Fan"
|
||||
msgstr "Extruder hűtőventilátor"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "machine_extruder_cooling_fan_number description"
|
||||
msgid ""
|
||||
"The number of the print cooling fan associated with this extruder. Only change "
|
||||
"this from the default value of 0 when you have a different print cooling fan for "
|
||||
"each extruder."
|
||||
msgstr ""
|
||||
"Az extruderekhez társított nyomtatási hűtőventilátor száma.Csak akkor "
|
||||
"változtassa meg ezt az alapértelmezett 0-tól, ha minden extruder számára külön "
|
||||
"nyomtatási hűtőventilátor van."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "platform_adhesion label"
|
||||
msgid "Build Plate Adhesion"
|
||||
msgstr "Tárgyasztal tapadása"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "platform_adhesion description"
|
||||
msgid "Adhesion"
|
||||
msgstr "Tapadás"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x label"
|
||||
msgid "Extruder Prime X Position"
|
||||
msgstr "Az Extruder Elsődleges X Pozíciója"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_x description"
|
||||
msgid ""
|
||||
"The X coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgstr "Az az X koordináta, ahol a fúvóka a nyomtatást kezdi."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y label"
|
||||
msgid "Extruder Prime Y Position"
|
||||
msgstr "Az Extruder Elsődleges Y Pozíciója"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "extruder_prime_pos_y description"
|
||||
msgid ""
|
||||
"The Y coordinate of the position where the nozzle primes at the start of "
|
||||
"printing."
|
||||
msgstr "Az az Y koordináta, ahol a fúvóka a nyomtatást kezdi."
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "material label"
|
||||
msgid "Material"
|
||||
msgstr "Anyag"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "material description"
|
||||
msgid "Material"
|
||||
msgstr "Anyag"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "material_diameter label"
|
||||
msgid "Diameter"
|
||||
msgstr "Átmérő"
|
||||
|
||||
#: fdmextruder.def.json
|
||||
msgctxt "material_diameter description"
|
||||
msgid ""
|
||||
"Adjusts the diameter of the filament used. Match this value with the diameter of "
|
||||
"the used filament."
|
||||
msgstr "Szálátmérő beállítása. Egyeztesd a használt nyomtatószál átmérőjével."
|
7711
resources/i18n/hu_HU/fdmprinter.def.json.po
Normal file
7711
resources/i18n/hu_HU/fdmprinter.def.json.po
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user