Merge branch 'master' into bremco-graphics_buffer_update

This commit is contained in:
Remco Burema 2021-11-07 22:12:17 +01:00
commit 6dff2bebb5
No known key found for this signature in database
GPG Key ID: 215C49431D43F98C
264 changed files with 7955 additions and 127 deletions

View File

@ -7,5 +7,5 @@ license: "LGPL-3.0"
message: "If you use this software, please cite it using these metadata."
repository-code: "https://github.com/ultimaker/cura/"
title: "Ultimaker Cura"
version: "4.10.0"
...
version: "4.12.0"
...

View File

@ -2,7 +2,7 @@ Cura
====
Ultimaker Cura is a state-of-the-art slicer application to prepare your 3D models for printing with a 3D printer. With hundreds of settings and hundreds of community-managed print profiles, Ultimaker Cura is sure to lead your next project to a success.
![Screenshot](screenshot.png)
![Screenshot](cura-logo.PNG)
Logging Issues
------------

BIN
cura-logo.PNG Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 KiB

View File

@ -62,7 +62,7 @@ class Account(QObject):
updatePackagesEnabledChanged = pyqtSignal(bool)
CLIENT_SCOPES = "account.user.read drive.backup.read drive.backup.write packages.download " \
"packages.rating.read packages.rating.write connect.cluster.read connect.cluster.write " \
"packages.rating.read packages.rating.write connect.cluster.read connect.cluster.write connect.material.write " \
"library.project.read library.project.write cura.printjob.read cura.printjob.write " \
"cura.mesh.read cura.mesh.write"

View File

@ -159,4 +159,4 @@ def arrange(nodes_to_arrange: List["SceneNode"],
grouped_operation, not_fit_count = createGroupOperationForArrange(nodes_to_arrange, build_volume, fixed_nodes, factor, add_new_nodes_in_scene)
grouped_operation.push()
return not_fit_count != 0
return not_fit_count == 0

View File

@ -289,7 +289,7 @@ class BuildVolume(SceneNode):
# Mark the node as outside build volume if the set extruder is disabled
extruder_position = node.callDecoration("getActiveExtruderPosition")
try:
if not self._global_container_stack.extruderList[int(extruder_position)].isEnabled:
if not self._global_container_stack.extruderList[int(extruder_position)].isEnabled and not node.callDecoration("isGroup"):
node.setOutsideBuildArea(True)
continue
except IndexError: # Happens when the extruder list is too short. We're not done building the printer in memory yet.

View File

@ -162,6 +162,7 @@ class CuraApplication(QtApplication):
self.default_theme = "cura-light"
self.change_log_url = "https://ultimaker.com/ultimaker-cura-latest-features?utm_source=cura&utm_medium=software&utm_campaign=cura-update-features"
self.beta_change_log_url = "https://ultimaker.com/ultimaker-cura-beta-features?utm_source=cura&utm_medium=software&utm_campaign=cura-update-features"
self._boot_loading_time = time.time()

View File

@ -1,7 +1,8 @@
# Copyright (c) 2018 Ultimaker B.V.
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtCore import Qt, QTimer, pyqtProperty, pyqtSignal
from typing import Optional
from UM.Qt.ListModel import ListModel
from UM.i18n import i18nCatalog
@ -20,6 +21,7 @@ class GlobalStacksModel(ListModel):
MetaDataRole = Qt.UserRole + 5
DiscoverySourceRole = Qt.UserRole + 6 # For separating local and remote printers in the machine management page
RemovalWarningRole = Qt.UserRole + 7
IsOnlineRole = Qt.UserRole + 8
def __init__(self, parent = None) -> None:
super().__init__(parent)
@ -31,18 +33,49 @@ class GlobalStacksModel(ListModel):
self.addRoleName(self.HasRemoteConnectionRole, "hasRemoteConnection")
self.addRoleName(self.MetaDataRole, "metadata")
self.addRoleName(self.DiscoverySourceRole, "discoverySource")
self.addRoleName(self.IsOnlineRole, "isOnline")
self._change_timer = QTimer()
self._change_timer.setInterval(200)
self._change_timer.setSingleShot(True)
self._change_timer.timeout.connect(self._update)
self._filter_connection_type = None # type: Optional[ConnectionType]
self._filter_online_only = False
# Listen to changes
CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
CuraContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onContainerChanged)
CuraContainerRegistry.getInstance().containerRemoved.connect(self._onContainerChanged)
self._updateDelayed()
filterConnectionTypeChanged = pyqtSignal()
def setFilterConnectionType(self, new_filter: Optional[ConnectionType]) -> None:
self._filter_connection_type = new_filter
@pyqtProperty(int, fset = setFilterConnectionType, notify = filterConnectionTypeChanged)
def filterConnectionType(self) -> int:
"""
The connection type to filter the list of printers by.
Only printers that match this connection type will be listed in the
model.
"""
if self._filter_connection_type is None:
return -1
return self._filter_connection_type.value
filterOnlineOnlyChanged = pyqtSignal()
def setFilterOnlineOnly(self, new_filter: bool) -> None:
self._filter_online_only = new_filter
@pyqtProperty(bool, fset = setFilterOnlineOnly, notify = filterOnlineOnlyChanged)
def filterOnlineOnly(self) -> bool:
"""
Whether to filter the global stacks to show only printers that are online.
"""
return self._filter_online_only
def _onContainerChanged(self, container) -> None:
"""Handler for container added/removed events from registry"""
@ -58,6 +91,10 @@ class GlobalStacksModel(ListModel):
container_stacks = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine")
for container_stack in container_stacks:
if self._filter_connection_type is not None: # We want to filter on connection types.
if not any((connection_type == self._filter_connection_type for connection_type in container_stack.configuredConnectionTypes)):
continue # No connection type on this printer matches the filter.
has_remote_connection = False
for connection_type in container_stack.configuredConnectionTypes:
@ -67,6 +104,10 @@ class GlobalStacksModel(ListModel):
if parseBool(container_stack.getMetaDataEntry("hidden", False)):
continue
is_online = container_stack.getMetaDataEntry("is_online", False)
if self._filter_online_only and not is_online:
continue
device_name = container_stack.getMetaDataEntry("group_name", container_stack.getName())
section_name = "Connected printers" if has_remote_connection else "Preset printers"
section_name = self._catalog.i18nc("@info:title", section_name)
@ -82,6 +123,7 @@ class GlobalStacksModel(ListModel):
"hasRemoteConnection": has_remote_connection,
"metadata": container_stack.getMetaData().copy(),
"discoverySource": section_name,
"removalWarning": removal_warning})
"removalWarning": removal_warning,
"isOnline": is_online})
items.sort(key=lambda i: (not i["hasRemoteConnection"], i["name"]))
self.setItems(items)

View File

@ -107,7 +107,7 @@ class IntentCategoryModel(ListModel):
qualities = IntentModel()
qualities.setIntentCategory(category)
result.append({
"name": IntentCategoryModel.translation(category, "name", catalog.i18nc("@label", "Unknown")),
"name": IntentCategoryModel.translation(category, "name", category),
"description": IntentCategoryModel.translation(category, "description", None),
"intent_category": category,
"weight": list(IntentCategoryModel._get_translations().keys()).index(category),

View File

@ -2,21 +2,21 @@
# Cura is released under the terms of the LGPLv3 or higher.
import copy # To duplicate materials.
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QUrl
from PyQt5.QtGui import QDesktopServices
from typing import Any, Dict, Optional, TYPE_CHECKING
import uuid # To generate new GUIDs for new materials.
import zipfile # To export all materials in a .zip archive.
from PyQt5.QtGui import QDesktopServices
from UM.Message import Message
from UM.i18n import i18nCatalog
from UM.Logger import Logger
from UM.Message import Message
from UM.Resources import Resources # To find QML files.
from UM.Signal import postponeSignals, CompressTechnique
import cura.CuraApplication # Imported like this to prevent circular imports.
import cura.CuraApplication # Imported like this to prevent cirmanagecular imports.
from cura.Machines.ContainerTree import ContainerTree
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry # To find the sets of materials belonging to each other, and currently loaded extruder stacks.
from cura.UltimakerCloud.CloudMaterialSync import CloudMaterialSync
if TYPE_CHECKING:
from cura.Machines.MaterialNode import MaterialNode
@ -33,6 +33,7 @@ class MaterialManagementModel(QObject):
def __init__(self, parent: Optional[QObject] = None) -> None:
super().__init__(parent = parent)
self._material_sync = CloudMaterialSync(parent=self)
self._checkIfNewMaterialsWereInstalled()
def _checkIfNewMaterialsWereInstalled(self) -> None:
@ -89,6 +90,7 @@ class MaterialManagementModel(QObject):
elif sync_message_action == "learn_more":
QDesktopServices.openUrl(QUrl("https://support.ultimaker.com/hc/en-us/articles/360013137919?utm_source=cura&utm_medium=software&utm_campaign=sync-material-printer-message"))
@pyqtSlot("QVariant", result = bool)
def canMaterialBeRemoved(self, material_node: "MaterialNode") -> bool:
"""Can a certain material be deleted, or is it still in use in one of the container stacks anywhere?
@ -323,52 +325,10 @@ class MaterialManagementModel(QObject):
except ValueError: # Material was not in the favorites list.
Logger.log("w", "Material {material_base_file} was already not a favorite material.".format(material_base_file = material_base_file))
@pyqtSlot(result = QUrl)
def getPreferredExportAllPath(self) -> QUrl:
@pyqtSlot()
def openSyncAllWindow(self) -> None:
"""
Get the preferred path to export materials to.
Opens the window to sync all materials.
"""
self._material_sync.openSyncAllWindow()
If there is a removable drive, that should be the preferred path. Otherwise it should be the most recent local
file path.
:return: The preferred path to export all materials to.
"""
cura_application = cura.CuraApplication.CuraApplication.getInstance()
device_manager = cura_application.getOutputDeviceManager()
devices = device_manager.getOutputDevices()
for device in devices:
if device.__class__.__name__ == "RemovableDriveOutputDevice":
return QUrl.fromLocalFile(device.getId())
else: # No removable drives? Use local path.
return cura_application.getDefaultPath("dialog_material_path")
@pyqtSlot(QUrl)
def exportAll(self, file_path: QUrl) -> None:
"""
Export all materials to a certain file path.
:param file_path: The path to export the materials to.
"""
registry = CuraContainerRegistry.getInstance()
try:
archive = zipfile.ZipFile(file_path.toLocalFile(), "w", compression = zipfile.ZIP_DEFLATED)
except OSError as e:
Logger.log("e", f"Can't write to destination {file_path.toLocalFile()}: {type(e)} - {str(e)}")
error_message = Message(
text = catalog.i18nc("@error:text Followed by an error message of why it could not save", "Could not save material archive to {filename}:").format(filename = file_path.toLocalFile()) + " " + str(e),
title = catalog.i18nc("@error:title", "Failed to save material archive"),
message_type = Message.MessageType.ERROR
)
error_message.show()
return
for metadata in registry.findInstanceContainersMetadata(type = "material"):
if metadata["base_file"] != metadata["id"]: # Only process base files.
continue
if metadata["id"] == "empty_material": # Don't export the empty material.
continue
material = registry.findContainers(id = metadata["id"])[0]
suffix = registry.getMimeTypeForContainer(type(material)).preferredSuffix
filename = metadata["id"] + "." + suffix
try:
archive.writestr(filename, material.serialize())
except OSError as e:
Logger.log("e", f"An error has occurred while writing the material \'{metadata['id']}\' in the file \'{filename}\': {e}.")

View File

@ -1,4 +1,4 @@
# Copyright (c) 2018 Ultimaker B.V.
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from UM.FileHandler.FileHandler import FileHandler #For typing.
@ -114,6 +114,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
return b"".join(file_data_bytes_list)
def _update(self) -> None:
"""
Update the connection state of this device.
This is called on regular intervals.
"""
if self._last_response_time:
time_since_last_response = time() - self._last_response_time
else:
@ -127,11 +132,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
if time_since_last_response > self._timeout_time >= time_since_last_request:
# Go (or stay) into timeout.
if self._connection_state_before_timeout is None:
self._connection_state_before_timeout = self._connection_state
self._connection_state_before_timeout = self.connectionState
self.setConnectionState(ConnectionState.Closed)
elif self._connection_state == ConnectionState.Closed:
elif self.connectionState == ConnectionState.Closed:
# Go out of timeout.
if self._connection_state_before_timeout is not None: # sanity check, but it should never be None here
self.setConnectionState(self._connection_state_before_timeout)
@ -361,7 +366,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
self._last_response_time = time()
if self._connection_state == ConnectionState.Connecting:
if self.connectionState == ConnectionState.Connecting:
self.setConnectionState(ConnectionState.Connected)
callback_key = reply.url().toString() + str(reply.operation())

View File

@ -1,11 +1,13 @@
# Copyright (c) 2018 Ultimaker B.V.
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from enum import IntEnum
from typing import Callable, List, Optional, Union
from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject, QTimer, QUrl
from PyQt5.QtWidgets import QMessageBox
import cura.CuraApplication # Imported like this to prevent circular imports.
from UM.Logger import Logger
from UM.Signal import signalemitter
from UM.Qt.QtApplication import QtApplication
@ -120,11 +122,22 @@ class PrinterOutputDevice(QObject, OutputDevice):
callback(QMessageBox.Yes)
def isConnected(self) -> bool:
return self._connection_state != ConnectionState.Closed and self._connection_state != ConnectionState.Error
"""
Returns whether we could theoretically send commands to this printer.
:return: `True` if we are connected, or `False` if not.
"""
return self.connectionState != ConnectionState.Closed and self.connectionState != ConnectionState.Error
def setConnectionState(self, connection_state: "ConnectionState") -> None:
if self._connection_state != connection_state:
"""
Store the connection state of the printer.
Causes everything that displays the connection state to update its QML models.
:param connection_state: The new connection state to store.
"""
if self.connectionState != connection_state:
self._connection_state = connection_state
cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack().setMetaDataEntry("is_online", self.isConnected())
self.connectionStateChanged.emit(self._id)
@pyqtProperty(int, constant = True)
@ -133,6 +146,10 @@ class PrinterOutputDevice(QObject, OutputDevice):
@pyqtProperty(int, notify = connectionStateChanged)
def connectionState(self) -> "ConnectionState":
"""
Get the connection state of the printer, e.g. whether it is connected, still connecting, error state, etc.
:return: The current connection state of this output device.
"""
return self._connection_state
def _update(self) -> None:

View File

@ -0,0 +1,256 @@
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import enum
import functools # For partial methods to use as callbacks with information pre-filled.
import json # To serialise metadata for API calls.
import os # To delete the archive when we're done.
from PyQt5.QtCore import QUrl
import tempfile # To create an archive before we upload it.
import cura.CuraApplication # Imported like this to prevent circular imports.
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry # To find all printers to upload to.
from cura.UltimakerCloud import UltimakerCloudConstants # To know where the API is.
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope # To know how to communicate with this server.
from UM.i18n import i18nCatalog
from UM.Job import Job
from UM.Logger import Logger
from UM.Signal import Signal
from UM.TaskManagement.HttpRequestManager import HttpRequestManager # To call the API.
from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope
from typing import Any, cast, Dict, List, Optional, TYPE_CHECKING
if TYPE_CHECKING:
from PyQt5.QtNetwork import QNetworkReply
from cura.UltimakerCloud.CloudMaterialSync import CloudMaterialSync
catalog = i18nCatalog("cura")
class UploadMaterialsError(Exception):
"""
Class to indicate something went wrong while uploading.
"""
pass
class UploadMaterialsJob(Job):
"""
Job that uploads a set of materials to the Digital Factory.
The job has a number of stages:
- First, it generates an archive of all materials. This typically takes a lot of processing power during which the
GIL remains locked.
- Then it requests the API to upload an archive.
- Then it uploads the archive to the URL given by the first request.
- Then it tells the API that the archive can be distributed to the printers.
"""
UPLOAD_REQUEST_URL = f"{UltimakerCloudConstants.CuraCloudAPIRoot}/connect/v1/materials/upload"
UPLOAD_CONFIRM_URL = UltimakerCloudConstants.CuraCloudAPIRoot + "/connect/v1/clusters/{cluster_id}/printers/{cluster_printer_id}/action/import_material"
class Result(enum.IntEnum):
SUCCESS = 0
FAILED = 1
class PrinterStatus(enum.Enum):
UPLOADING = "uploading"
SUCCESS = "success"
FAILED = "failed"
def __init__(self, material_sync: "CloudMaterialSync"):
super().__init__()
self._material_sync = material_sync
self._scope = JsonDecoratorScope(UltimakerCloudScope(cura.CuraApplication.CuraApplication.getInstance())) # type: JsonDecoratorScope
self._archive_filename = None # type: Optional[str]
self._archive_remote_id = None # type: Optional[str] # ID that the server gives to this archive. Used to communicate about the archive to the server.
self._printer_sync_status = {} # type: Dict[str, str]
self._printer_metadata = [] # type: List[Dict[str, Any]]
self.processProgressChanged.connect(self._onProcessProgressChanged)
uploadCompleted = Signal() # Triggered when the job is really complete, including uploading to the cloud.
processProgressChanged = Signal() # Triggered when we've made progress creating the archive.
uploadProgressChanged = Signal() # Triggered when we've made progress with the complete job. This signal emits a progress fraction (0-1) as well as the status of every printer.
def run(self) -> None:
"""
Generates an archive of materials and starts uploading that archive to the cloud.
"""
self._printer_metadata = CuraContainerRegistry.getInstance().findContainerStacksMetadata(
type = "machine",
connection_type = "3", # Only cloud printers.
is_online = "True", # Only online printers. Otherwise the server gives an error.
host_guid = "*", # Required metadata field. Otherwise we get a KeyError.
um_cloud_cluster_id = "*" # Required metadata field. Otherwise we get a KeyError.
)
for printer in self._printer_metadata:
self._printer_sync_status[printer["host_guid"]] = self.PrinterStatus.UPLOADING.value
try:
archive_file = tempfile.NamedTemporaryFile("wb", delete = False)
archive_file.close()
self._archive_filename = archive_file.name
self._material_sync.exportAll(QUrl.fromLocalFile(self._archive_filename), notify_progress = self.processProgressChanged)
except OSError as e:
Logger.error(f"Failed to create archive of materials to sync with printers: {type(e)} - {e}")
self.failed(UploadMaterialsError(catalog.i18nc("@text:error", "Failed to create archive of materials to sync with printers.")))
return
try:
file_size = os.path.getsize(self._archive_filename)
except OSError as e:
Logger.error(f"Failed to load the archive of materials to sync it with printers: {type(e)} - {e}")
self.failed(UploadMaterialsError(catalog.i18nc("@text:error", "Failed to load the archive of materials to sync it with printers.")))
return
request_metadata = {
"data": {
"file_size": file_size,
"material_profile_name": "cura.umm", # File name can be anything as long as it's .umm. It's not used by anyone.
"content_type": "application/zip", # This endpoint won't receive files of different MIME types.
"origin": "cura" # Some identifier against hackers intercepting this upload request, apparently.
}
}
request_payload = json.dumps(request_metadata).encode("UTF-8")
http = HttpRequestManager.getInstance()
http.put(
url = self.UPLOAD_REQUEST_URL,
data = request_payload,
callback = self.onUploadRequestCompleted,
error_callback = self.onError,
scope = self._scope
)
def onUploadRequestCompleted(self, reply: "QNetworkReply") -> None:
"""
Triggered when we successfully requested to upload a material archive.
We then need to start uploading the material archive to the URL that the request answered with.
:param reply: The reply from the server to our request to upload an archive.
"""
response_data = HttpRequestManager.readJSON(reply)
if response_data is None:
Logger.error(f"Invalid response to material upload request. Could not parse JSON data.")
self.failed(UploadMaterialsError(catalog.i18nc("@text:error", "The response from Digital Factory appears to be corrupted.")))
return
if "data" not in response_data:
Logger.error(f"Invalid response to material upload request: Missing 'data' field that contains the entire response.")
self.failed(UploadMaterialsError(catalog.i18nc("@text:error", "The response from Digital Factory is missing important information.")))
return
if "upload_url" not in response_data["data"]:
Logger.error(f"Invalid response to material upload request: Missing 'upload_url' field to upload archive to.")
self.failed(UploadMaterialsError(catalog.i18nc("@text:error", "The response from Digital Factory is missing important information.")))
return
if "material_profile_id" not in response_data["data"]:
Logger.error(f"Invalid response to material upload request: Missing 'material_profile_id' to communicate about the materials with the server.")
self.failed(UploadMaterialsError(catalog.i18nc("@text:error", "The response from Digital Factory is missing important information.")))
return
upload_url = response_data["data"]["upload_url"]
self._archive_remote_id = response_data["data"]["material_profile_id"]
try:
with open(cast(str, self._archive_filename), "rb") as f:
file_data = f.read()
except OSError as e:
Logger.error(f"Failed to load archive back in for sending to cloud: {type(e)} - {e}")
self.failed(UploadMaterialsError(catalog.i18nc("@text:error", "Failed to load the archive of materials to sync it with printers.")))
return
http = HttpRequestManager.getInstance()
http.put(
url = upload_url,
data = file_data,
callback = self.onUploadCompleted,
error_callback = self.onError,
scope = self._scope
)
def onUploadCompleted(self, reply: "QNetworkReply") -> None:
"""
When we've successfully uploaded the archive to the cloud, we need to notify the API to start syncing that
archive to every printer.
:param reply: The reply from the cloud storage when the upload succeeded.
"""
for container_stack in self._printer_metadata:
cluster_id = container_stack["um_cloud_cluster_id"]
printer_id = container_stack["host_guid"]
http = HttpRequestManager.getInstance()
http.post(
url = self.UPLOAD_CONFIRM_URL.format(cluster_id = cluster_id, cluster_printer_id = printer_id),
callback = functools.partial(self.onUploadConfirmed, printer_id),
error_callback = functools.partial(self.onUploadConfirmed, printer_id), # Let this same function handle the error too.
scope = self._scope,
data = json.dumps({"data": {"material_profile_id": self._archive_remote_id}}).encode("UTF-8")
)
def onUploadConfirmed(self, printer_id: str, reply: "QNetworkReply", error: Optional["QNetworkReply.NetworkError"] = None) -> None:
"""
Triggered when we've got a confirmation that the material is synced with the printer, or that syncing failed.
If syncing succeeded we mark this printer as having the status "success". If it failed we mark the printer as
"failed". If this is the last upload that needed to be completed, we complete the job with either a success
state (every printer successfully synced) or a failed state (any printer failed).
:param printer_id: The printer host_guid that we completed syncing with.
:param reply: The reply that the server gave to confirm.
:param error: If the request failed, this error gives an indication what happened.
"""
if error is not None:
Logger.error(f"Failed to confirm uploading material archive to printer {printer_id}: {error}")
self._printer_sync_status[printer_id] = self.PrinterStatus.FAILED.value
else:
self._printer_sync_status[printer_id] = self.PrinterStatus.SUCCESS.value
still_uploading = len([val for val in self._printer_sync_status.values() if val == self.PrinterStatus.UPLOADING.value])
self.uploadProgressChanged.emit(0.8 + (len(self._printer_sync_status) - still_uploading) / len(self._printer_sync_status), self.getPrinterSyncStatus())
if still_uploading == 0: # This is the last response to be processed.
if self.PrinterStatus.FAILED.value in self._printer_sync_status.values():
self.setResult(self.Result.FAILED)
self.setError(UploadMaterialsError(catalog.i18nc("@text:error", "Failed to connect to Digital Factory to sync materials with some of the printers.")))
else:
self.setResult(self.Result.SUCCESS)
self.uploadCompleted.emit(self.getResult(), self.getError())
def onError(self, reply: "QNetworkReply", error: Optional["QNetworkReply.NetworkError"]) -> None:
"""
Used as callback from HTTP requests when the request failed.
The given network error from the `HttpRequestManager` is logged, and the job is marked as failed.
:param reply: The main reply of the server. This reply will most likely not be valid.
:param error: The network error (Qt's enum) that occurred.
"""
Logger.error(f"Failed to upload material archive: {error}")
self.failed(UploadMaterialsError(catalog.i18nc("@text:error", "Failed to connect to Digital Factory.")))
def getPrinterSyncStatus(self) -> Dict[str, str]:
"""
For each printer, identified by host_guid, this gives the current status of uploading the material archive.
The possible states are given in the PrinterStatus enum.
:return: A dictionary with printer host_guids as keys, and their status as values.
"""
return self._printer_sync_status
def failed(self, error: UploadMaterialsError) -> None:
"""
Helper function for when we have a general failure.
This sets the sync status for all printers to failed, sets the error on
the job and the result of the job to FAILED.
:param error: An error to show to the user.
"""
self.setResult(self.Result.FAILED)
self.setError(error)
for printer_id in self._printer_sync_status:
self._printer_sync_status[printer_id] = self.PrinterStatus.FAILED.value
self.uploadProgressChanged.emit(1.0, self.getPrinterSyncStatus())
self.uploadCompleted.emit(self.getResult(), self.getError())
def _onProcessProgressChanged(self, progress: float) -> None:
"""
When we progress in the process of uploading materials, we not only signal the new progress (float from 0 to 1)
but we also signal the current status of every printer. These are emitted as the two parameters of the signal.
:param progress: The progress of this job, between 0 and 1.
"""
self.uploadProgressChanged.emit(progress * 0.8, self.getPrinterSyncStatus()) # The processing is 80% of the progress bar.

View File

@ -1191,7 +1191,7 @@ class MachineManager(QObject):
self.setIntentByCategory(quality_changes_group.intent_category)
self._reCalculateNumUserSettings()
self.correctExtruderSettings()
self.activeQualityGroupChanged.emit()
self.activeQualityChangesGroupChanged.emit()

View File

@ -61,6 +61,10 @@ class SettingInheritanceManager(QObject):
result.append(key)
return result
@pyqtSlot(str, str, result = bool)
def hasOverrides(self, key: str, extruder_index: str):
return key in self.getOverridesForExtruder(key, extruder_index)
@pyqtSlot(str, str, result = "QStringList")
def getOverridesForExtruder(self, key: str, extruder_index: str) -> List[str]:
if self._global_container_stack is None:

View File

@ -0,0 +1,217 @@
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl
from PyQt5.QtGui import QDesktopServices
from typing import Dict, Optional, TYPE_CHECKING
import zipfile # To export all materials in a .zip archive.
import cura.CuraApplication # Imported like this to prevent circular imports.
from UM.Resources import Resources
from cura.PrinterOutput.UploadMaterialsJob import UploadMaterialsJob, UploadMaterialsError # To export materials to the output printer.
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
from UM.i18n import i18nCatalog
from UM.Logger import Logger
from UM.Message import Message
if TYPE_CHECKING:
from UM.Signal import Signal
catalog = i18nCatalog("cura")
class CloudMaterialSync(QObject):
"""
Handles the synchronisation of material profiles with cloud accounts.
"""
def __init__(self, parent: QObject = None):
super().__init__(parent)
self.sync_all_dialog = None # type: Optional[QObject]
self._export_upload_status = "idle"
self._checkIfNewMaterialsWereInstalled()
self._export_progress = 0.0
self._printer_status = {} # type: Dict[str, str]
def _checkIfNewMaterialsWereInstalled(self) -> None:
"""
Checks whether new material packages were installed in the latest startup. If there were, then it shows
a message prompting the user to sync the materials with their printers.
"""
application = cura.CuraApplication.CuraApplication.getInstance()
for package_id, package_data in application.getPackageManager().getPackagesInstalledOnStartup().items():
if package_data["package_info"]["package_type"] == "material":
# At least one new material was installed
self._showSyncNewMaterialsMessage()
break
def openSyncAllWindow(self):
self.reset()
if self.sync_all_dialog is None:
qml_path = Resources.getPath(cura.CuraApplication.CuraApplication.ResourceTypes.QmlFiles, "Preferences",
"Materials", "MaterialsSyncDialog.qml")
self.sync_all_dialog = cura.CuraApplication.CuraApplication.getInstance().createQmlComponent(
qml_path, {})
if self.sync_all_dialog is None: # Failed to load QML file.
return
self.sync_all_dialog.setProperty("syncModel", self)
self.sync_all_dialog.setProperty("pageIndex", 0) # Return to first page.
self.sync_all_dialog.setProperty("hasExportedUsb", False) # If the user exported USB before, reset that page.
self.sync_all_dialog.show()
def _showSyncNewMaterialsMessage(self) -> None:
sync_materials_message = Message(
text = catalog.i18nc("@action:button",
"Please sync the material profiles with your printers before starting to print."),
title = catalog.i18nc("@action:button", "New materials installed"),
message_type = Message.MessageType.WARNING,
lifetime = 0
)
sync_materials_message.addAction(
"sync",
name = catalog.i18nc("@action:button", "Sync materials with printers"),
icon = "",
description = "Sync your newly installed materials with your printers.",
button_align = Message.ActionButtonAlignment.ALIGN_RIGHT
)
sync_materials_message.addAction(
"learn_more",
name = catalog.i18nc("@action:button", "Learn more"),
icon = "",
description = "Learn more about syncing your newly installed materials with your printers.",
button_align = Message.ActionButtonAlignment.ALIGN_LEFT,
button_style = Message.ActionButtonStyle.LINK
)
sync_materials_message.actionTriggered.connect(self._onSyncMaterialsMessageActionTriggered)
# Show the message only if there are printers that support material export
container_registry = cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry()
global_stacks = container_registry.findContainerStacks(type = "machine")
if any([stack.supportsMaterialExport for stack in global_stacks]):
sync_materials_message.show()
def _onSyncMaterialsMessageActionTriggered(self, sync_message: Message, sync_message_action: str):
if sync_message_action == "sync":
self.openSyncAllWindow()
sync_message.hide()
elif sync_message_action == "learn_more":
QDesktopServices.openUrl(QUrl("https://support.ultimaker.com/hc/en-us/articles/360013137919?utm_source=cura&utm_medium=software&utm_campaign=sync-material-printer-message"))
@pyqtSlot(result = QUrl)
def getPreferredExportAllPath(self) -> QUrl:
"""
Get the preferred path to export materials to.
If there is a removable drive, that should be the preferred path. Otherwise it should be the most recent local
file path.
:return: The preferred path to export all materials to.
"""
cura_application = cura.CuraApplication.CuraApplication.getInstance()
device_manager = cura_application.getOutputDeviceManager()
devices = device_manager.getOutputDevices()
for device in devices:
if device.__class__.__name__ == "RemovableDriveOutputDevice":
return QUrl.fromLocalFile(device.getId())
else: # No removable drives? Use local path.
return cura_application.getDefaultPath("dialog_material_path")
@pyqtSlot(QUrl)
def exportAll(self, file_path: QUrl, notify_progress: Optional["Signal"] = None) -> None:
"""
Export all materials to a certain file path.
:param file_path: The path to export the materials to.
"""
registry = CuraContainerRegistry.getInstance()
# Create empty archive.
try:
archive = zipfile.ZipFile(file_path.toLocalFile(), "w", compression = zipfile.ZIP_DEFLATED)
except OSError as e:
Logger.log("e", f"Can't write to destination {file_path.toLocalFile()}: {type(e)} - {str(e)}")
error_message = Message(
text = catalog.i18nc("@message:text", "Could not save material archive to {}:").format(file_path.toLocalFile()) + " " + str(e),
title = catalog.i18nc("@message:title", "Failed to save material archive"),
message_type = Message.MessageType.ERROR
)
error_message.show()
return
materials_metadata = registry.findInstanceContainersMetadata(type = "material")
for index, metadata in enumerate(materials_metadata):
if notify_progress is not None:
progress = index / len(materials_metadata)
notify_progress.emit(progress)
if metadata["base_file"] != metadata["id"]: # Only process base files.
continue
if metadata["id"] == "empty_material": # Don't export the empty material.
continue
material = registry.findContainers(id = metadata["id"])[0]
suffix = registry.getMimeTypeForContainer(type(material)).preferredSuffix
filename = metadata["id"] + "." + suffix
try:
archive.writestr(filename, material.serialize())
except OSError as e:
Logger.log("e", f"An error has occurred while writing the material \'{metadata['id']}\' in the file \'{filename}\': {e}.")
exportUploadStatusChanged = pyqtSignal()
@pyqtProperty(str, notify = exportUploadStatusChanged)
def exportUploadStatus(self) -> str:
return self._export_upload_status
@pyqtSlot()
def exportUpload(self) -> None:
"""
Export all materials and upload them to the user's account.
"""
self._export_upload_status = "uploading"
self.exportUploadStatusChanged.emit()
job = UploadMaterialsJob(self)
job.uploadProgressChanged.connect(self._onUploadProgressChanged)
job.uploadCompleted.connect(self.exportUploadCompleted)
job.start()
def _onUploadProgressChanged(self, progress: float, printers_status: Dict[str, str]):
self.setExportProgress(progress)
self.setPrinterStatus(printers_status)
def exportUploadCompleted(self, job_result: UploadMaterialsJob.Result, job_error: Optional[Exception]):
if not self.sync_all_dialog: # Shouldn't get triggered before the dialog is open, but better to check anyway.
return
if job_result == UploadMaterialsJob.Result.FAILED:
if isinstance(job_error, UploadMaterialsError):
self.sync_all_dialog.setProperty("syncStatusText", str(job_error))
else: # Could be "None"
self.sync_all_dialog.setProperty("syncStatusText", catalog.i18nc("@text", "Unknown error."))
self._export_upload_status = "error"
else:
self._export_upload_status = "success"
self.exportUploadStatusChanged.emit()
exportProgressChanged = pyqtSignal(float)
def setExportProgress(self, progress: float) -> None:
self._export_progress = progress
self.exportProgressChanged.emit(self._export_progress)
@pyqtProperty(float, fset = setExportProgress, notify = exportProgressChanged)
def exportProgress(self) -> float:
return self._export_progress
printerStatusChanged = pyqtSignal()
def setPrinterStatus(self, new_status: Dict[str, str]) -> None:
self._printer_status = new_status
self.printerStatusChanged.emit()
@pyqtProperty("QVariantMap", fset = setPrinterStatus, notify = printerStatusChanged)
def printerStatus(self) -> Dict[str, str]:
return self._printer_status
def reset(self) -> None:
self.setPrinterStatus({})
self.setExportProgress(0.0)
self._export_upload_status = "idle"
self.exportUploadStatusChanged.emit()

View File

@ -1,9 +1,15 @@
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtNetwork import QNetworkRequest
from UM.Logger import Logger
from UM.TaskManagement.HttpRequestScope import DefaultUserAgentScope
from cura.API import Account
from cura.CuraApplication import CuraApplication
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from cura.CuraApplication import CuraApplication
from cura.API.Account import Account
class UltimakerCloudScope(DefaultUserAgentScope):
@ -12,7 +18,7 @@ class UltimakerCloudScope(DefaultUserAgentScope):
Also add the user agent headers (see DefaultUserAgentScope).
"""
def __init__(self, application: CuraApplication):
def __init__(self, application: "CuraApplication"):
super().__init__(application)
api = application.getCuraAPI()
self._account = api.account # type: Account

View File

@ -123,6 +123,9 @@ class StartSliceJob(Job):
Job.yieldThread()
for changed_setting_key in changed_setting_keys:
if not stack.getProperty(changed_setting_key, "enabled"):
continue
validation_state = stack.getProperty(changed_setting_key, "validationState")
if validation_state is None:

View File

@ -11,6 +11,8 @@
# Modified by Jaime van Kessel (Ultimaker), j.vankessel@ultimaker.com to make it work for 15.10 / 2.x
# Modified by Ghostkeeper (Ultimaker), rubend@tutanota.com, to debug.
# Modified by Wes Hanney, https://github.com/novamxd, Retract Length + Speed, Clean up
# Modified by Alex Jaxon, https://github.com/legend069, Added option to modify Build Volume Temperature
# history / changelog:
# V3.0.1: TweakAtZ-state default 1 (i.e. the plugin works without any TweakAtZ comment)
@ -33,13 +35,17 @@
# V5.0: Bugfix for fall back after one layer and doubled G0 commands when using print speed tweak, Initial version for Cura 2.x
# V5.0.1: Bugfix for calling unknown property 'bedTemp' of previous settings storage and unknown variable 'speed'
# V5.1: API Changes included for use with Cura 2.2
# V5.2.0: Wes Hanney. Added support for changing Retract Length and Speed. Removed layer spread option. Fixed issue of cumulative ChangeZ
# V5.2.0: Wes Hanney. Added support for changing Retract Length and Speed. Removed layer spread option. Fixed issue of cumulative ChangeAtZ
# mods so they can now properly be stacked on top of each other. Applied code refactoring to clean up various coding styles. Added comments.
# Broke up functions for clarity. Split up class so it can be debugged outside of Cura.
# V5.2.1: Wes Hanney. Added support for firmware based retractions. Fixed issue of properly restoring previous values in single layer option.
# Added support for outputting changes to LCD (untested). Added type hints to most functions and variables. Added more comments. Created GCodeCommand
# class for better detection of G1 vs G10 or G11 commands, and accessing arguments. Moved most GCode methods to GCodeCommand class. Improved wording
# of Single Layer vs Keep Layer to better reflect what was happening.
# V5.3.0 Alex Jaxon, Added option to modify Build Volume Temperature keeping current format
#
# Uses -
# M220 S<factor in percent> - set speed factor override percentage
@ -56,9 +62,9 @@ from ..Script import Script
import re
# this was broken up into a separate class so the main ChangeZ script could be debugged outside of Cura
# this was broken up into a separate class so the main ChangeAtZ script could be debugged outside of Cura
class ChangeAtZ(Script):
version = "5.2.1"
version = "5.3.0"
def getSettingDataString(self):
return """{
@ -69,10 +75,10 @@ class ChangeAtZ(Script):
"settings": {
"caz_enabled": {
"label": "Enabled",
"description": "Allows adding multiple ChangeZ mods and disabling them as needed.",
"description": "Allows adding multiple ChangeAtZ mods and disabling them as needed.",
"type": "bool",
"default_value": true
},
},
"a_trigger": {
"label": "Trigger",
"description": "Trigger at height or at layer no.",
@ -119,7 +125,7 @@ class ChangeAtZ(Script):
"description": "Displays the current changes to the LCD",
"type": "bool",
"default_value": false
},
},
"e1_Change_speed": {
"label": "Change Speed",
"description": "Select if total speed (print and travel) has to be changed",
@ -222,6 +228,23 @@ class ChangeAtZ(Script):
"maximum_value_warning": "120",
"enabled": "h1_Change_bedTemp"
},
"h1_Change_buildVolumeTemperature": {
"label": "Change Build Volume Temperature",
"description": "Select if Build Volume Temperature has to be changed",
"type": "bool",
"default_value": false
},
"h2_buildVolumeTemperature": {
"label": "Build Volume Temperature",
"description": "New Build Volume Temperature",
"unit": "C",
"type": "float",
"default_value": 20,
"minimum_value": "0",
"minimum_value_warning": "10",
"maximum_value_warning": "50",
"enabled": "h1_Change_buildVolumeTemperature"
},
"i1_Change_extruderOne": {
"label": "Change Extruder 1 Temp",
"description": "Select if First Extruder Temperature has to be changed",
@ -278,25 +301,25 @@ class ChangeAtZ(Script):
"description": "Indicates you would like to modify retraction properties.",
"type": "bool",
"default_value": false
},
},
"caz_retractstyle": {
"label": "Retract Style",
"description": "Specify if you're using firmware retraction or linear move based retractions. Check your printer settings to see which you're using.",
"type": "enum",
"options": {
"linear": "Linear Move",
"linear": "Linear Move",
"firmware": "Firmware"
},
"default_value": "linear",
"enabled": "caz_change_retract"
},
},
"caz_change_retractfeedrate": {
"label": "Change Retract Feed Rate",
"description": "Changes the retraction feed rate during print",
"type": "bool",
"default_value": false,
"enabled": "caz_change_retract"
},
},
"caz_retractfeedrate": {
"label": "Retract Feed Rate",
"description": "New Retract Feed Rate (mm/s)",
@ -325,7 +348,7 @@ class ChangeAtZ(Script):
"minimum_value_warning": "0",
"maximum_value_warning": "20",
"enabled": "caz_change_retractlength"
}
}
}
}"""
@ -345,6 +368,7 @@ class ChangeAtZ(Script):
self.setIntSettingIfEnabled(caz_instance, "g3_Change_flowrateOne", "flowrateOne", "g4_flowrateOne")
self.setIntSettingIfEnabled(caz_instance, "g5_Change_flowrateTwo", "flowrateTwo", "g6_flowrateTwo")
self.setFloatSettingIfEnabled(caz_instance, "h1_Change_bedTemp", "bedTemp", "h2_bedTemp")
self.setFloatSettingIfEnabled(caz_instance, "h1_Change_buildVolumeTemperature", "buildVolumeTemperature", "h2_buildVolumeTemperature")
self.setFloatSettingIfEnabled(caz_instance, "i1_Change_extruderOne", "extruderOne", "i2_extruderOne")
self.setFloatSettingIfEnabled(caz_instance, "i3_Change_extruderTwo", "extruderTwo", "i4_extruderTwo")
self.setIntSettingIfEnabled(caz_instance, "j1_Change_fanSpeed", "fanSpeed", "j2_fanSpeed")
@ -776,6 +800,10 @@ class ChangeAtZProcessor:
if "bedTemp" in values:
codes.append("BedTemp: " + str(round(values["bedTemp"])))
# looking for wait for Build Volume Temperature
if "buildVolumeTemperature" in values:
codes.append("buildVolumeTemperature: " + str(round(values["buildVolumeTemperature"])))
# set our extruder one temp (if specified)
if "extruderOne" in values:
codes.append("Extruder 1 Temp: " + str(round(values["extruderOne"])))
@ -858,6 +886,10 @@ class ChangeAtZProcessor:
if "bedTemp" in values:
codes.append("M140 S" + str(values["bedTemp"]))
# looking for wait for Build Volume Temperature
if "buildVolumeTemperature" in values:
codes.append("M141 S" + str(values["buildVolumeTemperature"]))
# set our extruder one temp (if specified)
if "extruderOne" in values:
codes.append("M104 S" + str(values["extruderOne"]) + " T0")
@ -943,7 +975,7 @@ class ChangeAtZProcessor:
# nothing to do
return ""
# Returns the unmodified GCODE line from previous ChangeZ edits
# Returns the unmodified GCODE line from previous ChangeAtZ edits
@staticmethod
def getOriginalLine(line: str) -> str:
@ -990,7 +1022,7 @@ class ChangeAtZProcessor:
else:
return self.currentZ >= self.targetZ
# Marks any current ChangeZ layer defaults in the layer for deletion
# Marks any current ChangeAtZ layer defaults in the layer for deletion
@staticmethod
def markChangesForDeletion(layer: str):
return re.sub(r";\[CAZD:", ";[CAZD:DELETE:", layer)
@ -1288,7 +1320,7 @@ class ChangeAtZProcessor:
# flag that we're inside our target layer
self.insideTargetLayer = True
# Removes all the ChangeZ layer defaults from the given layer
# Removes all the ChangeAtZ layer defaults from the given layer
@staticmethod
def removeMarkedChanges(layer: str) -> str:
return re.sub(r";\[CAZD:DELETE:[\s\S]+?:CAZD\](\n|$)", "", layer)
@ -1364,6 +1396,16 @@ class ChangeAtZProcessor:
# move to the next command
return
# handle Build Volume Temperature changes, really shouldn't want to wait for enclousure temp mid print though.
if command.command == "M141" or command.command == "M191":
# get our bed temp if provided
if "S" in command.arguments:
self.lastValues["buildVolumeTemperature"] = command.getArgumentAsFloat("S")
# move to the next command
return
# handle extruder temp changes
if command.command == "M104" or command.command == "M109":

View File

@ -6,6 +6,7 @@ from PyQt5.QtWidgets import QApplication
from UM.Application import Application
from UM.Math.Vector import Vector
from UM.Operations.TranslateOperation import TranslateOperation
from UM.Tool import Tool
from UM.Event import Event, MouseEvent
from UM.Mesh.MeshBuilder import MeshBuilder
@ -120,8 +121,8 @@ class SupportEraser(Tool):
# First add node to the scene at the correct position/scale, before parenting, so the eraser mesh does not get scaled with the parent
op.addOperation(AddSceneNodeOperation(node, self._controller.getScene().getRoot()))
op.addOperation(SetParentOperation(node, parent))
op.addOperation(TranslateOperation(node, position, set_position = True))
op.push()
node.setPosition(position, CuraSceneNode.TransformSpace.World)
CuraApplication.getInstance().getController().getScene().sceneChanged.emit(node)

View File

@ -1,4 +1,4 @@
# Copyright (c) 2020 Ultimaker B.V.
# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import os
@ -16,6 +16,7 @@ from UM.Util import parseBool
from cura.API import Account
from cura.API.Account import SyncState
from cura.CuraApplication import CuraApplication
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry # To update printer metadata with information received about cloud printers.
from cura.Settings.CuraStackBuilder import CuraStackBuilder
from cura.Settings.GlobalStack import GlobalStack
from cura.UltimakerCloud.UltimakerCloudConstants import META_UM_LINKED_TO_ACCOUNT
@ -129,6 +130,8 @@ class CloudOutputDeviceManager:
self._um_cloud_printers[device_id].setMetaDataEntry(META_UM_LINKED_TO_ACCOUNT, True)
self._onDevicesDiscovered(new_clusters)
self._updateOnlinePrinters(all_clusters)
# Hide the current removed_printers_message, if there is any
if self._removed_printers_message:
self._removed_printers_message.actionTriggered.disconnect(self._onRemovedPrintersMessageActionTriggered)
@ -154,6 +157,8 @@ class CloudOutputDeviceManager:
self._syncing = False
self._account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SUCCESS)
Logger.debug("Synced cloud printers with account.")
def _onGetRemoteClusterFailed(self, reply: QNetworkReply, error: QNetworkReply.NetworkError) -> None:
self._syncing = False
self._account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.ERROR)
@ -255,6 +260,16 @@ class CloudOutputDeviceManager:
message_text = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + "<ul>" + device_names + "</ul>"
message.setText(message_text)
def _updateOnlinePrinters(self, printer_responses: Dict[str, CloudClusterResponse]) -> None:
"""
Update the metadata of the printers to store whether they are online or not.
:param printer_responses: The responses received from the API about the printer statuses.
"""
for container_stack in CuraContainerRegistry.getInstance().findContainerStacks(type = "machine"):
cluster_id = container_stack.getMetaDataEntry("um_cloud_cluster_id", "")
if cluster_id in printer_responses:
container_stack.setMetaDataEntry("is_online", printer_responses[cluster_id].is_online)
def _updateOutdatedMachine(self, outdated_machine: GlobalStack, new_cloud_output_device: CloudOutputDevice) -> None:
"""
Update the cloud metadata of a pre-existing machine that is rediscovered (e.g. if the printer was removed and

View File

@ -3,6 +3,7 @@
import configparser
import io
import json
import os.path
from typing import List, Tuple
@ -49,6 +50,28 @@ class VersionUpgrade411to412(VersionUpgrade):
# Update version number.
parser["metadata"]["setting_version"] = "19"
# If the account scope in 4.11 is outdated, delete it so that the user is enforced to log in again and get the
# correct permissions.
new_scopes = {"account.user.read",
"drive.backup.read",
"drive.backup.write",
"packages.download",
"packages.rating.read",
"packages.rating.write",
"connect.cluster.read",
"connect.cluster.write",
"library.project.read",
"library.project.write",
"cura.printjob.read",
"cura.printjob.write",
"cura.mesh.read",
"cura.mesh.write",
"cura.material.write"}
if "ultimaker_auth_data" in parser["general"]:
ultimaker_auth_data = json.loads(parser["general"]["ultimaker_auth_data"])
if new_scopes - set(ultimaker_auth_data["scope"].split(" ")):
parser["general"]["ultimaker_auth_data"] = "{}"
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]

View File

@ -1943,7 +1943,7 @@
"description": "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns).",
"type": "[int]",
"default_value": "[ ]",
"enabled": "infill_pattern != 'lightning' and infill_pattern != 'concentric' and infill_sparse_density > 0",
"enabled": "infill_pattern not in ('concentric', 'cross', 'cross_3d', 'gyroid', 'lightning') and infill_sparse_density > 0",
"limit_to_extruder": "infill_extruder_nr",
"settable_per_mesh": true
},

View File

@ -95,9 +95,6 @@
},
"skin_monotonic" : {
"value": true
},
"top_bottom_pattern" : {
"value": "'zigzag'"
}
}
}

View File

@ -168,7 +168,6 @@
"support_z_distance": { "value": "0" },
"switch_extruder_prime_speed": { "value": "15" },
"switch_extruder_retraction_amount": { "value": "8" },
"top_bottom_pattern" : {"value": "'zigzag'"},
"top_bottom_thickness": { "value": "1" },
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
"wall_0_inset": { "value": "0" },

View File

@ -160,7 +160,6 @@
"support_z_distance": { "value": "0" },
"switch_extruder_prime_speed": { "value": "15" },
"switch_extruder_retraction_amount": { "value": "8" },
"top_bottom_pattern" : {"value": "'zigzag'"},
"top_bottom_thickness": { "value": "1" },
"travel_avoid_supports": { "value": "True" },
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },

View File

@ -161,7 +161,6 @@
"support_z_distance": { "value": "0" },
"switch_extruder_prime_speed": { "value": "15" },
"switch_extruder_retraction_amount": { "value": "8" },
"top_bottom_pattern" : {"value": "'zigzag'"},
"top_bottom_thickness": { "value": "1" },
"travel_avoid_supports": { "value": "True" },
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },

View File

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

View File

@ -0,0 +1,52 @@
{
"version": 2,
"name": "XYZprinting da Vinci 1.0 Pro",
"inherits": "xyzprinting_base",
"metadata": {
"author": "XYZprinting Software",
"manufacturer": "XYZprinting",
"visible": true,
"file_formats": "text/x-gcode",
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"supports_usb_connection": true,
"preferred_quality_type": "normal",
"quality_definition": "xyzprinting_da_vinci_1p0_pro",
"preferred_variant_name": "Copper 0.4mm Nozzle",
"variants_name": "Nozzle Type",
"machine_extruder_trains": {
"0": "xyzprinting_da_vinci_1p0_pro_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "XYZprinting da Vinci 1.0 Pro" },
"machine_shape": { "default_value": "rectangular"},
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 200.00 },
"machine_depth": { "default_value": 200.00 },
"machine_height": { "default_value":200.00 },
"machine_center_is_zero": { "default_value": false },
"machine_head_with_fans_polygon": {
"default_value": [
[ -20, -10 ],
[ -20, 10 ],
[ 10, 10 ],
[ 10, -10 ]
]
},
"material_flow_layer_0": {"value": 120},
"cool_fan_enabled": { "default_value": true },
"cool_fan_speed_0": { "value": 100 },
"brim_line_count": { "value" : 5 },
"skirt_line_count": { "default_value" : 5 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "G28 ; home all axes\nG1 Z15 F5000 ; lift nozzle\nG92 E0\nG1 F200 E3\n"
},
"machine_end_gcode": {
"default_value": "M104 S0 ; turn off temperature\nM105 S0; \nG28 X0 ; home X axis\nM84 ; disable motors\n"
}
}
}

View File

@ -0,0 +1,53 @@
{
"version": 2,
"name": "XYZprinting da Vinci Jr. 1.0A Pro",
"inherits": "xyzprinting_base",
"metadata": {
"author": "XYZprinting Software",
"manufacturer": "XYZprinting",
"visible": true,
"file_formats": "text/x-gcode",
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"exclude_materials": ["generic_hips", "generic_petg", "generic_bam", "ultimaker_bam", "generic_pva", "ultimaker_pva", "generic_tough_pla", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "generic_cffcpe", "generic_cffpa", "generic_gffcpe", "generic_gffpa", "structur3d_dap100silicone", "ultimaker_petg_blue", "ultimaker_petg_grey", "ultimaker_petg_black", "ultimaker_petg_green", "ultimaker_petg_white", "ultimaker_petg_orange", "ultimaker_petg_silver", "ultimaker_petg_yellow", "ultimaker_petg_transparent", "ultimaker_petg_red_translucent", "ultimaker_petg_blue_translucent", "ultimaker_petg_green_translucent", "ultimaker_petg_yellow_fluorescent", "ultimaker_petg_red" ],
"supports_usb_connection": true,
"preferred_quality_type": "normal",
"quality_definition": "xyzprinting_da_vinci_jr_1p0a_pro",
"preferred_variant_name": "Copper 0.4mm Nozzle",
"variants_name": "Nozzle Type",
"machine_extruder_trains": {
"0": "xyzprinting_da_vinci_jr_1p0a_pro_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "XYZprinting da Vinci Jr. 1.0A Pro" },
"machine_shape": { "default_value": "rectangular"},
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 175.00 },
"machine_depth": { "default_value": 175.00 },
"machine_height": { "default_value":175.00 },
"machine_center_is_zero": { "default_value": false },
"machine_head_with_fans_polygon": {
"default_value": [
[ -20, -10 ],
[ -20, 10 ],
[ 10, 10 ],
[ 10, -10 ]
]
},
"material_flow_layer_0": {"value": 120},
"cool_fan_enabled": { "default_value": true },
"cool_fan_speed_0": { "value": 100 },
"brim_line_count": { "value" : 5 },
"skirt_line_count": { "default_value" : 5 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "G28 ; home all axes\nG1 Z15 F5000 ; lift nozzle\nG92 E0\nG1 F200 E3\n"
},
"machine_end_gcode": {
"default_value": "M104 S0 ; turn off temperature\nM105 S0; \nG28 X0 ; home X axis\nM84 ; disable motors\n"
}
}
}

View File

@ -0,0 +1,52 @@
{
"version": 2,
"name": "XYZprinting da Vinci Jr. Pro Xe+",
"inherits": "xyzprinting_base",
"metadata": {
"author": "XYZprinting Software",
"manufacturer": "XYZprinting",
"visible": true,
"file_formats": "text/x-gcode",
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"supports_usb_connection": true,
"preferred_quality_type": "normal",
"quality_definition": "xyzprinting_da_vinci_jr_pro_xeplus",
"preferred_variant_name": "Copper 0.4mm Nozzle",
"variants_name": "Nozzle Type",
"machine_extruder_trains": {
"0": "xyzprinting_da_vinci_jr_pro_xeplus_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "XYZprinting da Vinci Jr. Pro Xe+" },
"machine_shape": { "default_value": "rectangular"},
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 175.00 },
"machine_depth": { "default_value": 175.00 },
"machine_height": { "default_value":175.00 },
"machine_center_is_zero": { "default_value": false },
"machine_head_with_fans_polygon": {
"default_value": [
[ -20, -10 ],
[ -20, 10 ],
[ 10, 10 ],
[ 10, -10 ]
]
},
"material_flow_layer_0": {"value": 120},
"cool_fan_enabled": { "default_value": true },
"cool_fan_speed_0": { "value": 100 },
"brim_line_count": { "value" : 5 },
"skirt_line_count": { "default_value" : 5 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "G28 ; home all axes\nG1 Z15 F5000 ; lift nozzle\nG92 E0\nG1 F200 E3\n"
},
"machine_end_gcode": {
"default_value": "M104 S0 ; turn off temperature\nM105 S0; \nG28 X0 ; home X axis\nM84 ; disable motors\n"
}
}
}

View File

@ -0,0 +1,52 @@
{
"version": 2,
"name": "XYZprinting da Vinci Jr. Pro X+",
"inherits": "xyzprinting_base",
"metadata": {
"author": "XYZprinting Software",
"manufacturer": "XYZprinting",
"visible": true,
"file_formats": "text/x-gcode",
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"supports_usb_connection": true,
"preferred_quality_type": "normal",
"quality_definition": "xyzprinting_da_vinci_jr_pro_xplus",
"preferred_variant_name": "Copper 0.4mm Nozzle",
"variants_name": "Nozzle Type",
"machine_extruder_trains": {
"0": "xyzprinting_da_vinci_jr_pro_xplus_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "XYZprinting da Vinci Jr. Pro X+" },
"machine_shape": { "default_value": "rectangular"},
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 175.00 },
"machine_depth": { "default_value": 175.00 },
"machine_height": { "default_value":175.00 },
"machine_center_is_zero": { "default_value": false },
"machine_head_with_fans_polygon": {
"default_value": [
[ -20, -10 ],
[ -20, 10 ],
[ 10, 10 ],
[ 10, -10 ]
]
},
"material_flow_layer_0": {"value": 120},
"cool_fan_enabled": { "default_value": true },
"cool_fan_speed_0": { "value": 100 },
"brim_line_count": { "value" : 5 },
"skirt_line_count": { "default_value" : 5 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "G28 ; home all axes\nG1 Z15 F5000 ; lift nozzle\nG92 E0\nG1 F200 E3\n"
},
"machine_end_gcode": {
"default_value": "M104 S0 ; turn off temperature\nM105 S0; \nG28 X0 ; home X axis\nM84 ; disable motors\n"
}
}
}

View File

@ -0,0 +1,52 @@
{
"version": 2,
"name": "XYZprinting da Vinci Jr. WiFi Pro",
"inherits": "xyzprinting_base",
"metadata": {
"author": "XYZprinting Software",
"manufacturer": "XYZprinting",
"visible": true,
"file_formats": "text/x-gcode",
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"supports_usb_connection": true,
"preferred_quality_type": "normal",
"quality_definition": "xyzprinting_da_vinci_jr_w_pro",
"preferred_variant_name": "Hardened Steel 0.4mm Nozzle",
"variants_name": "Nozzle Type",
"machine_extruder_trains": {
"0": "xyzprinting_da_vinci_jr_w_pro_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "XYZprinting da Vinci Jr. WiFi Pro" },
"machine_shape": { "default_value": "rectangular"},
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 150.00 },
"machine_depth": { "default_value": 150.00 },
"machine_height": { "default_value":150.00 },
"machine_center_is_zero": { "default_value": false },
"machine_head_with_fans_polygon": {
"default_value": [
[ -20, -10 ],
[ -20, 10 ],
[ 10, 10 ],
[ 10, -10 ]
]
},
"material_flow_layer_0": {"value": 120},
"cool_fan_enabled": { "default_value": true },
"cool_fan_speed_0": { "value": 100 },
"brim_line_count": { "value" : 5 },
"skirt_line_count": { "default_value" : 5 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "G28 ; home all axes\nG1 Z15 F5000 ; lift nozzle\nG92 E0\nG1 F200 E3\n"
},
"machine_end_gcode": {
"default_value": "M104 S0 ; turn off temperature\nM105 S0; \nG28 X0 ; home X axis\nM84 ; disable motors\n"
}
}
}

View File

@ -0,0 +1,52 @@
{
"version": 2,
"name": "XYZprinting da Vinci Super",
"inherits": "xyzprinting_base",
"metadata": {
"author": "XYZprinting Software",
"manufacturer": "XYZprinting",
"visible": true,
"file_formats": "text/x-gcode",
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"supports_usb_connection": true,
"preferred_quality_type": "normal",
"quality_definition": "xyzprinting_da_vinci_super",
"preferred_variant_name": "Copper 0.4mm Nozzle",
"variants_name": "Nozzle Type",
"machine_extruder_trains": {
"0": "xyzprinting_da_vinci_super_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "XYZprinting da Vinci Super" },
"machine_shape": { "default_value": "rectangular"},
"machine_heated_bed": { "default_value": true },
"machine_width": { "default_value": 300.00 },
"machine_depth": { "default_value": 300.00 },
"machine_height": { "default_value":300.00 },
"machine_center_is_zero": { "default_value": false },
"machine_head_with_fans_polygon": {
"default_value": [
[ -20, -10 ],
[ -20, 10 ],
[ 10, 10 ],
[ 10, -10 ]
]
},
"material_flow_layer_0": {"value": 120},
"cool_fan_enabled": { "default_value": true },
"cool_fan_speed_0": { "value": 100 },
"brim_line_count": { "value" : 5 },
"skirt_line_count": { "default_value" : 5 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "G28 ; home all axes\nG1 Z15 F5000 ; lift nozzle\nG92 E0\nG1 F200 E3\n"
},
"machine_end_gcode": {
"default_value": "M104 S0 ; turn off temperature\nM105 S0; \nG28 X0 ; home X axis\nM84 ; disable motors\n"
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -51,7 +51,6 @@ Menu
onTriggered:
{
UM.Preferences.setValue("general/camera_perspective_mode", "perspective")
checked = cameraViewMenu.cameraMode == "perspective"
}
exclusiveGroup: group
}
@ -63,7 +62,6 @@ Menu
onTriggered:
{
UM.Preferences.setValue("general/camera_perspective_mode", "orthographic")
checked = cameraViewMenu.cameraMode == "orthographic"
}
exclusiveGroup: group
}

View File

@ -201,8 +201,7 @@ Item
onClicked:
{
forceActiveFocus();
exportAllMaterialsDialog.folder = base.materialManagementModel.getPreferredExportAllPath();
exportAllMaterialsDialog.open();
base.materialManagementModel.openSyncAllWindow();
}
visible: Cura.MachineManager.activeMachine.supportsMaterialExport
}
@ -383,19 +382,6 @@ Item
}
}
FileDialog
{
id: exportAllMaterialsDialog
title: catalog.i18nc("@title:window", "Export All Materials")
selectExisting: false
nameFilters: ["Material archives (*.umm)", "All files (*)"]
onAccepted:
{
base.materialManagementModel.exportAll(fileUrl);
CuraApplication.setDefaultPath("dialog_material_path", folder);
}
}
MessageDialog
{
id: messageDialog

View File

@ -0,0 +1,762 @@
//Copyright (c) 2021 Ultimaker B.V.
//Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.15
import QtQuick.Window 2.1
import Cura 1.1 as Cura
import UM 1.4 as UM
Window
{
id: materialsSyncDialog
property variant catalog: UM.I18nCatalog { name: "cura" }
title: catalog.i18nc("@title:window", "Sync materials with printers")
minimumWidth: UM.Theme.getSize("modal_window_minimum").width
minimumHeight: UM.Theme.getSize("modal_window_minimum").height
width: minimumWidth
height: minimumHeight
modality: Qt.ApplicationModal
property variant syncModel
property alias pageIndex: swipeView.currentIndex
property alias syncStatusText: syncStatusLabel.text
property bool hasExportedUsb: false
SwipeView
{
id: swipeView
anchors.fill: parent
interactive: false
Rectangle
{
id: introPage
color: UM.Theme.getColor("main_background")
Column
{
spacing: UM.Theme.getSize("default_margin").height
anchors.fill: parent
anchors.margins: UM.Theme.getSize("default_margin").width
Label
{
text: catalog.i18nc("@title:header", "Sync materials with printers")
font: UM.Theme.getFont("large_bold")
color: UM.Theme.getColor("text")
}
Label
{
text: catalog.i18nc("@text", "Following a few simple steps, you will be able to synchronize all your material profiles with your printers.")
font: UM.Theme.getFont("medium")
color: UM.Theme.getColor("text")
wrapMode: Text.Wrap
width: parent.width
}
Image
{
source: UM.Theme.getImage("material_ecosystem")
width: parent.width
sourceSize.width: width
}
}
Cura.PrimaryButton
{
id: startButton
anchors
{
right: parent.right
rightMargin: UM.Theme.getSize("default_margin").width
bottom: parent.bottom
bottomMargin: UM.Theme.getSize("default_margin").height
}
text: catalog.i18nc("@button", "Start")
onClicked:
{
if(Cura.API.account.isLoggedIn)
{
swipeView.currentIndex += 2; //Skip sign in page.
}
else
{
swipeView.currentIndex += 1;
}
}
}
Cura.TertiaryButton
{
anchors
{
left: parent.left
leftMargin: UM.Theme.getSize("default_margin").width
verticalCenter: startButton.verticalCenter
}
text: catalog.i18nc("@button", "Why do I need to sync material profiles?")
iconSource: UM.Theme.getIcon("LinkExternal")
isIconOnRightSide: true
onClicked: Qt.openUrlExternally("https://support.ultimaker.com/hc/en-us/articles/360013137919?utm_source=cura&utm_medium=software&utm_campaign=sync-material-printer-why")
}
}
Rectangle
{
id: signinPage
color: UM.Theme.getColor("main_background")
Connections //While this page is active, continue to the next page if the user logs in.
{
target: Cura.API.account
function onLoginStateChanged(is_logged_in)
{
if(is_logged_in && signinPage.SwipeView.isCurrentItem)
{
swipeView.currentIndex += 1;
}
}
}
ColumnLayout
{
spacing: UM.Theme.getSize("default_margin").height
anchors.fill: parent
anchors.margins: UM.Theme.getSize("default_margin").width
Label
{
text: catalog.i18nc("@title:header", "Sign in")
font: UM.Theme.getFont("large_bold")
color: UM.Theme.getColor("text")
Layout.preferredHeight: height
}
Label
{
text: catalog.i18nc("@text", "To automatically sync the material profiles with all your printers connected to Digital Factory you need to be signed in in Cura.")
font: UM.Theme.getFont("medium")
color: UM.Theme.getColor("text")
wrapMode: Text.Wrap
width: parent.width
Layout.maximumWidth: width
Layout.preferredHeight: height
}
Item
{
Layout.preferredWidth: parent.width
Layout.fillHeight: true
Image
{
source: UM.Theme.getImage("first_run_ultimaker_cloud")
width: parent.width / 2
sourceSize.width: width
anchors.centerIn: parent
}
}
Item
{
width: parent.width
height: childrenRect.height
Layout.preferredHeight: height
Cura.SecondaryButton
{
anchors.left: parent.left
text: catalog.i18nc("@button", "Sync materials with USB")
onClicked: swipeView.currentIndex = removableDriveSyncPage.SwipeView.index
}
Cura.PrimaryButton
{
anchors.right: parent.right
text: catalog.i18nc("@button", "Sign in")
onClicked: Cura.API.account.login()
}
}
}
}
Rectangle
{
id: printerListPage
color: UM.Theme.getColor("main_background")
ColumnLayout
{
spacing: UM.Theme.getSize("default_margin").height
anchors.fill: parent
anchors.margins: UM.Theme.getSize("default_margin").width
visible: cloudPrinterList.count > 0
Row
{
Layout.preferredHeight: childrenRect.height
spacing: UM.Theme.getSize("default_margin").width
states: [
State
{
name: "idle"
when: typeof syncModel === "undefined" || syncModel.exportUploadStatus == "idle" || syncModel.exportUploadStatus == "uploading"
PropertyChanges { target: printerListHeader; text: catalog.i18nc("@title:header", "The following printers will receive the new material profiles:") }
PropertyChanges { target: printerListHeaderIcon; status: UM.StatusIcon.Status.NEUTRAL; width: 0 }
},
State
{
name: "error"
when: typeof syncModel !== "undefined" && syncModel.exportUploadStatus == "error"
PropertyChanges { target: printerListHeader; text: catalog.i18nc("@title:header", "Something went wrong when sending the materials to the printers.") }
PropertyChanges { target: printerListHeaderIcon; status: UM.StatusIcon.Status.ERROR }
},
State
{
name: "success"
when: typeof syncModel !== "undefined" && syncModel.exportUploadStatus == "success"
PropertyChanges { target: printerListHeader; text: catalog.i18nc("@title:header", "Material profiles successfully synced with the following printers:") }
PropertyChanges { target: printerListHeaderIcon; status: UM.StatusIcon.Status.POSITIVE }
}
]
UM.StatusIcon
{
id: printerListHeaderIcon
width: UM.Theme.getSize("section_icon").width
height: width
anchors.verticalCenter: parent.verticalCenter
}
Label
{
id: printerListHeader
anchors.verticalCenter: parent.verticalCenter
//Text is always defined by the states above.
font: UM.Theme.getFont("large_bold")
color: UM.Theme.getColor("text")
}
}
Row
{
Layout.preferredWidth: parent.width
Layout.preferredHeight: childrenRect.height
Label
{
id: syncStatusLabel
width: parent.width - UM.Theme.getSize("default_margin").width - troubleshootingLink.width
wrapMode: Text.Wrap
elide: Text.ElideRight
visible: text !== ""
text: ""
color: UM.Theme.getColor("text")
font: UM.Theme.getFont("medium")
}
Cura.TertiaryButton
{
id: troubleshootingLink
text: catalog.i18nc("@button", "Troubleshooting")
visible: typeof syncModel !== "undefined" && syncModel.exportUploadStatus == "error"
iconSource: UM.Theme.getIcon("LinkExternal")
onClicked: Qt.openUrlExternally("https://support.ultimaker.com/hc/en-us/articles/360012019239?utm_source=cura&utm_medium=software&utm_campaign=sync-material-wizard-troubleshoot-cloud-printer")
}
}
ScrollView
{
id: printerListScrollView
width: parent.width
Layout.preferredWidth: width
Layout.fillHeight: true
clip: true
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
ListView
{
id: printerList
width: parent.width
spacing: UM.Theme.getSize("default_margin").height
model: cloudPrinterList
delegate: Rectangle
{
id: delegateContainer
color: "transparent"
border.color: UM.Theme.getColor("lining")
border.width: UM.Theme.getSize("default_lining").width
width: printerListScrollView.width
height: UM.Theme.getSize("card").height
property string syncStatus:
{
var printer_id = model.metadata["host_guid"]
if(syncModel.printerStatus[printer_id] === undefined) //No status information available. Could be added after we started syncing.
{
return "idle";
}
return syncModel.printerStatus[printer_id];
}
Cura.IconWithText
{
anchors
{
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: Math.round(parent.height - height) / 2 //Equal margin on the left as above and below.
right: parent.right
rightMargin: Math.round(parent.height - height) / 2
}
text: model.name
font: UM.Theme.getFont("medium")
source: UM.Theme.getIcon("Printer", "medium")
iconColor: UM.Theme.getColor("machine_selector_printer_icon")
iconSize: UM.Theme.getSize("machine_selector_icon").width
//Printer status badge (always cloud, but whether it's online or offline).
UM.RecolorImage
{
width: UM.Theme.getSize("printer_status_icon").width
height: UM.Theme.getSize("printer_status_icon").height
anchors
{
bottom: parent.bottom
bottomMargin: -Math.round(height / 6)
left: parent.left
leftMargin: parent.iconSize - Math.round(width * 5 / 6)
}
source: UM.Theme.getIcon("CloudBadge", "low")
color: UM.Theme.getColor("primary")
//Make a themeable circle in the background so we can change it in other themes.
Rectangle
{
anchors.centerIn: parent
width: parent.width - 1.5 //1.5 pixels smaller (at least sqrt(2), regardless of pixel scale) so that the circle doesn't show up behind the icon due to anti-aliasing.
height: parent.height - 1.5
radius: width / 2
color: UM.Theme.getColor("connection_badge_background")
z: parent.z - 1
}
}
}
UM.RecolorImage
{
id: printerSpinner
width: UM.Theme.getSize("section_icon").width
height: width
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: Math.round((parent.height - height) / 2) //Same margin on the right as above and below.
visible: delegateContainer.syncStatus === "uploading"
source: UM.Theme.getIcon("ArrowDoubleCircleRight")
color: UM.Theme.getColor("primary")
RotationAnimator
{
target: printerSpinner
from: 0
to: 360
duration: 1000
loops: Animation.Infinite
running: true
}
}
UM.StatusIcon
{
width: UM.Theme.getSize("section_icon").width
height: width
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: Math.round((parent.height - height) / 2) //Same margin on the right as above and below.
visible: delegateContainer.syncStatus === "failed" || delegateContainer.syncStatus === "success"
status: delegateContainer.syncStatus === "success" ? UM.StatusIcon.Status.POSITIVE : UM.StatusIcon.Status.ERROR
}
}
footer: Item
{
width: printerListScrollView.width
height: {
if(!visible)
{
return 0;
}
let h = UM.Theme.getSize("card").height + printerListTroubleshooting.height + UM.Theme.getSize("default_margin").height * 2; //1 margin between content and footer, 1 for troubleshooting link.
return h;
}
visible: includeOfflinePrinterList.count - cloudPrinterList.count > 0 && typeof syncModel !== "undefined" && syncModel.exportUploadStatus === "idle"
Rectangle
{
anchors.fill: parent
anchors.topMargin: UM.Theme.getSize("default_margin").height
border.color: UM.Theme.getColor("lining")
border.width: UM.Theme.getSize("default_lining").width
color: "transparent"
Row
{
anchors
{
fill: parent
margins: Math.round(UM.Theme.getSize("card").height - UM.Theme.getSize("machine_selector_icon").width) / 2 //Same margin as in other cards.
}
spacing: UM.Theme.getSize("default_margin").width
UM.StatusIcon
{
id: infoIcon
width: UM.Theme.getSize("section_icon").width
height: width
//Fake anchor.verticalCenter: printersMissingText.verticalCenter, since we can't anchor to things that aren't siblings.
anchors.top: parent.top
anchors.topMargin: Math.round(printersMissingText.height / 2 - height / 2)
status: UM.StatusIcon.Status.WARNING
}
Column
{
//Fill the total width. Can't use layouts because we need the anchors for vertical alignment.
width: parent.width - infoIcon.width - refreshListButton.width - parent.spacing * 2
spacing: UM.Theme.getSize("default_margin").height
Label
{
id: printersMissingText
text: catalog.i18nc("@text Asking the user whether printers are missing in a list.", "Printers missing?")
+ "\n"
+ catalog.i18nc("@text", "Make sure all your printers are turned ON and connected to Digital Factory.")
font: UM.Theme.getFont("medium")
color: UM.Theme.getColor("text")
elide: Text.ElideRight
}
Cura.TertiaryButton
{
id: printerListTroubleshooting
leftPadding: 0 //Want to visually align this to the text.
text: catalog.i18nc("@button", "Troubleshooting")
iconSource: UM.Theme.getIcon("LinkExternal")
onClicked: Qt.openUrlExternally("https://support.ultimaker.com/hc/en-us/articles/360012019239?utm_source=cura&utm_medium=software&utm_campaign=sync-material-wizard-troubleshoot-cloud-printer")
}
}
Cura.SecondaryButton
{
id: refreshListButton
//Fake anchor.verticalCenter: printersMissingText.verticalCenter, since we can't anchor to things that aren't siblings.
anchors.top: parent.top
anchors.topMargin: Math.round(printersMissingText.height / 2 - height / 2)
text: catalog.i18nc("@button", "Refresh List")
iconSource: UM.Theme.getIcon("ArrowDoubleCircleRight")
onClicked: Cura.API.account.sync(true)
}
}
}
}
}
}
Item
{
width: parent.width
height: childrenRect.height
Layout.preferredWidth: width
Layout.preferredHeight: height
Cura.SecondaryButton
{
anchors.left: parent.left
text: catalog.i18nc("@button", "Sync materials with USB")
onClicked: swipeView.currentIndex = removableDriveSyncPage.SwipeView.index
}
Cura.PrimaryButton
{
id: syncButton
anchors.right: parent.right
text:
{
if(typeof syncModel !== "undefined" && syncModel.exportUploadStatus == "error")
{
return catalog.i18nc("@button", "Try again");
}
if(typeof syncModel !== "undefined" && syncModel.exportUploadStatus == "success")
{
return catalog.i18nc("@button", "Done");
}
return catalog.i18nc("@button", "Sync");
}
onClicked:
{
if(typeof syncModel !== "undefined" && syncModel.exportUploadStatus == "success")
{
materialsSyncDialog.close();
}
else
{
syncModel.exportUpload();
}
}
visible:
{
if(!syncModel) //When the dialog is created, this is not set yet.
{
return true;
}
return syncModel.exportUploadStatus != "uploading";
}
}
Item
{
anchors.right: parent.right
width: childrenRect.width
height: syncButton.height
visible: !syncButton.visible
UM.RecolorImage
{
id: syncingIcon
height: UM.Theme.getSize("action_button_icon").height
width: height
anchors.verticalCenter: syncingLabel.verticalCenter
source: UM.Theme.getIcon("ArrowDoubleCircleRight")
color: UM.Theme.getColor("primary")
RotationAnimator
{
target: syncingIcon
from: 0
to: 360
duration: 1000
loops: Animation.Infinite
running: true
}
}
Label
{
id: syncingLabel
anchors.left: syncingIcon.right
anchors.leftMargin: UM.Theme.getSize("narrow_margin").width
text: catalog.i18nc("@button", "Syncing")
color: UM.Theme.getColor("primary")
font: UM.Theme.getFont("medium")
}
}
}
}
ColumnLayout //Placeholder for when the user has no cloud printers.
{
spacing: UM.Theme.getSize("default_margin").height
anchors.fill: parent
anchors.margins: UM.Theme.getSize("default_margin").width
visible: cloudPrinterList.count == 0
Label
{
text: catalog.i18nc("@title:header", "No printers found")
font: UM.Theme.getFont("large_bold")
color: UM.Theme.getColor("text")
Layout.preferredWidth: width
Layout.preferredHeight: height
}
Image
{
source: UM.Theme.getImage("3d_printer_faded")
sourceSize.width: width
fillMode: Image.PreserveAspectFit
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: parent.width / 3
}
Label
{
text: catalog.i18nc("@text", "It seems like you don't have access to any printers connected to Digital Factory.")
width: parent.width
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.Wrap
Layout.preferredWidth: width
Layout.preferredHeight: height
}
Item
{
Layout.preferredWidth: parent.width
Layout.fillHeight: true
Cura.TertiaryButton
{
text: catalog.i18nc("@button", "Learn how to connect your printer to Digital Factory")
iconSource: UM.Theme.getIcon("LinkExternal")
onClicked: Qt.openUrlExternally("https://support.ultimaker.com/hc/en-us/articles/360012019239?utm_source=cura&utm_medium=software&utm_campaign=sync-material-wizard-add-cloud-printer")
anchors.horizontalCenter: parent.horizontalCenter
}
}
Item
{
width: parent.width
height: childrenRect.height
Layout.preferredWidth: width
Layout.preferredHeight: height
Cura.SecondaryButton
{
anchors.left: parent.left
text: catalog.i18nc("@button", "Sync materials with USB")
onClicked: swipeView.currentIndex = removableDriveSyncPage.SwipeView.index
}
Cura.PrimaryButton
{
id: disabledSyncButton
anchors.right: parent.right
text: catalog.i18nc("@button", "Sync")
enabled: false //If there are no printers, always disable this button.
}
Cura.SecondaryButton
{
anchors.right: disabledSyncButton.left
anchors.rightMargin: UM.Theme.getSize("default_margin").width
text: catalog.i18nc("@button", "Refresh")
iconSource: UM.Theme.getIcon("ArrowDoubleCircleRight")
outlineColor: "transparent"
onClicked: Cura.API.account.sync(true)
}
}
}
}
Rectangle
{
id: removableDriveSyncPage
color: UM.Theme.getColor("main_background")
ColumnLayout
{
spacing: UM.Theme.getSize("default_margin").height
anchors.fill: parent
anchors.margins: UM.Theme.getSize("default_margin").width
Label
{
text: catalog.i18nc("@title:header", "Sync material profiles via USB")
font: UM.Theme.getFont("large_bold")
color: UM.Theme.getColor("text")
Layout.preferredHeight: height
}
Label
{
text: catalog.i18nc("@text In the UI this is followed by a list of steps the user needs to take.", "Follow the following steps to load the new material profiles to your printer.")
font: UM.Theme.getFont("medium")
color: UM.Theme.getColor("text")
wrapMode: Text.Wrap
width: parent.width
Layout.maximumWidth: width
Layout.preferredHeight: height
}
Row
{
width: parent.width
Layout.preferredWidth: width
Layout.fillHeight: true
spacing: UM.Theme.getSize("default_margin").width
Image
{
source: UM.Theme.getImage("insert_usb")
width: parent.width / 3
height: width
anchors.verticalCenter: parent.verticalCenter
sourceSize.width: width
}
Label
{
text: "1. " + catalog.i18nc("@text", "Click the export material archive button.")
+ "\n2. " + catalog.i18nc("@text", "Save the .umm file on a USB stick.")
+ "\n3. " + catalog.i18nc("@text", "Insert the USB stick into your printer and launch the procedure to load new material profiles.")
font: UM.Theme.getFont("medium")
color: UM.Theme.getColor("text")
wrapMode: Text.Wrap
width: parent.width * 2 / 3 - UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
}
}
Cura.TertiaryButton
{
text: catalog.i18nc("@button", "How to load new material profiles to my printer")
iconSource: UM.Theme.getIcon("LinkExternal")
onClicked: Qt.openUrlExternally("https://support.ultimaker.com/hc/en-us/articles/360013137919?utm_source=cura&utm_medium=software&utm_campaign=sync-material-wizard-how-usb")
}
Item
{
width: parent.width
height: childrenRect.height
Layout.preferredWidth: width
Layout.preferredHeight: height
Cura.SecondaryButton
{
anchors.left: parent.left
text: catalog.i18nc("@button", "Back")
onClicked: swipeView.currentIndex = 0 //Reset to first page.
}
Cura.PrimaryButton
{
id: exportUsbButton
anchors.right: parent.right
property bool hasExported: false
text: materialsSyncDialog.hasExportedUsb ? catalog.i18nc("@button", "Done") : catalog.i18nc("@button", "Export material archive")
onClicked:
{
if(!materialsSyncDialog.hasExportedUsb)
{
exportUsbDialog.folder = syncModel.getPreferredExportAllPath();
exportUsbDialog.open();
}
else
{
materialsSyncDialog.close();
}
}
}
}
}
}
}
Cura.GlobalStacksModel
{
id: cloudPrinterList
filterConnectionType: 3 //Only show cloud connections.
filterOnlineOnly: true //Only show printers that are online.
}
Cura.GlobalStacksModel
{
//In order to show a refresh button only when there are offline cloud printers, we need to know if there are any offline printers.
//A global stacks model without the filter for online-only printers allows this.
id: includeOfflinePrinterList
filterConnectionType: 3 //Still only show cloud connections.
}
FileDialog
{
id: exportUsbDialog
title: catalog.i18nc("@title:window", "Export All Materials")
selectExisting: false
nameFilters: ["Material archives (*.umm)", "All files (*)"]
onAccepted:
{
syncModel.exportAll(fileUrl);
CuraApplication.setDefaultPath("dialog_material_path", folder);
materialsSyncDialog.hasExportedUsb = true;
}
}
}

View File

@ -269,7 +269,7 @@ Item
}
// If the setting does not have a limit_to_extruder property (or is -1), use the active stack.
if (globalPropertyProvider.properties.limit_to_extruder === null || String(globalPropertyProvider.properties.limit_to_extruder) === "-1")
if (globalPropertyProvider.properties.limit_to_extruder === null || globalPropertyProvider.properties.limit_to_extruder === "-1")
{
return Cura.SettingInheritanceManager.settingsWithInheritanceWarning.indexOf(definition.key) >= 0
}
@ -283,7 +283,7 @@ Item
{
return false
}
return Cura.SettingInheritanceManager.getOverridesForExtruder(definition.key, String(globalPropertyProvider.properties.limit_to_extruder)).indexOf(definition.key) >= 0
return Cura.SettingInheritanceManager.hasOverrides(definition.key, globalPropertyProvider.properties.limit_to_extruder)
}
anchors.top: parent.top

View File

@ -302,7 +302,7 @@ Item
{
target: provider
property: "containerStackId"
when: model.settable_per_extruder || (inheritStackProvider.properties.limit_to_extruder !== null && inheritStackProvider.properties.limit_to_extruder >= 0);
when: model.settable_per_extruder || (inheritStackProvider.properties.limit_to_extruder !== undefined && inheritStackProvider.properties.limit_to_extruder >= 0);
value:
{
// Associate this binding with Cura.MachineManager.activeMachine.id in the beginning so this
@ -315,10 +315,10 @@ Item
//Not settable per extruder or there only is global, so we must pick global.
return contents.activeMachineId
}
if (inheritStackProvider.properties.limit_to_extruder !== null && inheritStackProvider.properties.limit_to_extruder >= 0)
if (inheritStackProvider.properties.limit_to_extruder !== undefined && inheritStackProvider.properties.limit_to_extruder >= 0)
{
//We have limit_to_extruder, so pick that stack.
return Cura.ExtruderManager.extruderIds[String(inheritStackProvider.properties.limit_to_extruder)];
return Cura.ExtruderManager.extruderIds[inheritStackProvider.properties.limit_to_extruder];
}
if (Cura.ExtruderManager.activeExtruderStackId)
{

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_1p0_pro
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 20
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 45
retraction_amount = 6.0
retraction_speed = 40
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_1p0_pro
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 20
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 45
retraction_amount = 6.0
retraction_speed = 40
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_1p0_pro
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 20
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 45
retraction_amount = 6.0
retraction_speed = 40
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_1p0_pro
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.35
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 20
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 45
retraction_amount = 6.0
retraction_speed = 40
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_wall = 20
speed_print = 60
speed_topbottom = 10
speed_infill = =speed_print
speed_support = 30
speed_travel = 120
retraction_amount = 3.0
retraction_speed = 20
retraction_prime_speed = 15
skirt_brim_speed = 30
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_wall = 20
speed_print = 60
speed_topbottom = 10
speed_infill = =speed_print
speed_support = 30
speed_travel = 120
retraction_amount = 3.0
retraction_speed = 20
retraction_prime_speed = 15
skirt_brim_speed = 30
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_wall = 20
speed_print = 60
speed_topbottom = 10
speed_infill = =speed_print
speed_support = 30
speed_travel = 120
retraction_amount = 3.0
retraction_speed = 20
retraction_prime_speed = 15
skirt_brim_speed = 30
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.3
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_wall = 20
speed_print = 60
speed_topbottom = 10
speed_infill = =speed_print
speed_support = 30
speed_travel = 120
retraction_amount = 3.0
retraction_speed = 20
retraction_prime_speed = 15
skirt_brim_speed = 30
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 40
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 40
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 40
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_abs
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.35
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_topbottom = 10
speed_wall = =speed_print
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 40
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_1p0_pro
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 20
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 100
retraction_amount = 4.0
retraction_speed = =speed_print
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_1p0_pro
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 20
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 100
retraction_amount = 4.0
retraction_speed = =speed_print
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_1p0_pro
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 20
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 100
retraction_amount = 4.0
retraction_speed = =speed_print
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,32 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_1p0_pro
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.35
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 20
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 100
retraction_amount = 4.0
retraction_speed = =speed_print
retraction_prime_speed = =retraction_speed
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_1p0a_pro
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =65
speed_support = =speed_print
speed_travel = 120
retraction_amount = 4.5
retraction_speed = =speed_print
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_1p0a_pro
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =65
speed_support = =speed_print
speed_travel = 120
retraction_amount = 4.5
retraction_speed = =speed_print
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,29 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_1p0a_pro
[metadata]
setting_version = 19
type = quality
quality_type = fine
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =65
speed_support = =speed_print
speed_travel = 120
retraction_amount = 4.5
retraction_speed = =speed_print
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_1p0a_pro
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.35
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =65
speed_support = =speed_print
speed_travel = 120
retraction_amount = 4.5
retraction_speed = =speed_print
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_pro_xeplus
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 15
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_pro_xeplus
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 15
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_pro_xeplus
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 15
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_pro_xeplus
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.3
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 15
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 120
retraction_amount = 7.0
retraction_speed = 15
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 120
retraction_amount = 7.0
retraction_speed = 15
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 15
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.3
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 120
retraction_amount = 5.0
retraction_speed = 15
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_w_pro
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_antibact_pla
variant = Stainless Steel 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 100
retraction_amount = 5.0
retraction_speed = 30
skirt_brim_speed = 30
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_w_pro
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_antibact_pla
variant = Stainless Steel 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 100
retraction_amount = 5.0
retraction_speed = 30
skirt_brim_speed = 30
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_w_pro
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_antibact_pla
variant = Stainless Steel 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 100
retraction_amount = 5.0
retraction_speed = 30
skirt_brim_speed = 30
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_w_pro
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_antibact_pla
variant = Stainless Steel 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.35
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 100
retraction_amount = 5.0
retraction_speed = 30
skirt_brim_speed = 30
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_infill = =speed_print
speed_support = =speed_print
speed_topbottom = 10
speed_travel = 120
retraction_amount = 5.5
retraction_speed = 50
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_infill = =speed_print
speed_support = =speed_print
speed_topbottom = 10
speed_travel = 120
retraction_amount = 5.5
retraction_speed = 50
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_infill = =speed_print
speed_support = =speed_print
speed_topbottom = 10
speed_travel = 120
retraction_amount = 5.5
retraction_speed = 50
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_antibact_pla
variant = Copper 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.35
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_infill = =speed_print
speed_support = =speed_print
speed_topbottom = 10
speed_travel = 120
retraction_amount = 5.5
retraction_speed = 50
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_1p0a_pro
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 120
retraction_amount = 6.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_1p0a_pro
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 120
retraction_amount = 6.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_1p0a_pro
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 120
retraction_amount = 6.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_1p0a_pro
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.35
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =speed_print
speed_support = =speed_print
speed_travel = 120
retraction_amount = 6.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_pro_xeplus
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =40
speed_support = =speed_print
speed_travel = 120
retraction_amount = 8.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_pro_xeplus
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =40
speed_support = =speed_print
speed_travel = 120
retraction_amount = 8.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_pro_xeplus
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =40
speed_support = =speed_print
speed_travel = 120
retraction_amount = 8.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_pro_xeplus
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.3
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = =40
speed_support = =speed_print
speed_travel = 120
retraction_amount = 8.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 40
speed_support = =speed_print
speed_travel = 120
retraction_amount = 8.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 40
speed_support = =speed_print
speed_travel = 120
retraction_amount = 8.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 40
speed_support = =speed_print
speed_travel = 120
retraction_amount = 8.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_pro_xplus
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.3
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 40
speed_support = =speed_print
speed_travel = 120
retraction_amount = 8.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_jr_w_pro
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 100
retraction_amount = 8.0
retraction_speed = 50
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_jr_w_pro
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 100
retraction_amount = 8.0
retraction_speed = 50
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Fine Quality
definition = xyzprinting_da_vinci_jr_w_pro
[metadata]
setting_version = 19
type = quality
quality_type = fine
weight = 0
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.1
layer_height_0 = 0.2
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 100
retraction_amount = 8.0
retraction_speed = 50
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,30 @@
[general]
version = 4
name = Normal Quality
definition = xyzprinting_da_vinci_jr_w_pro
[metadata]
setting_version = 19
type = quality
quality_type = normal
weight = -1
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.2
layer_height_0 = 0.35
material_diameter = 1.75
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_wall = =speed_print
speed_topbottom = 10
speed_infill = 60
speed_support = =speed_print
speed_travel = 100
retraction_amount = 8.0
retraction_speed = 50
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Coarse Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = coarse
weight = -3
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.4
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_infill = 45
speed_wall = =speed_print
speed_topbottom = 10
speed_support = =speed_print
speed_travel = 120
retraction_amount = 6.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

View File

@ -0,0 +1,31 @@
[general]
version = 4
name = Draft Quality
definition = xyzprinting_da_vinci_super
[metadata]
setting_version = 19
type = quality
quality_type = draft
weight = -2
material = xyzprinting_carbon_fiber
variant = Hardened Steel 0.4mm Nozzle
[values]
layer_height = 0.3
layer_height_0 = 0.4
material_diameter = 1.75
material_bed_temperature_layer_0 = =material_bed_temperature
material_print_temperature_layer_0 = =material_print_temperature
material_initial_print_temperature = =material_print_temperature
material_final_print_temperature = =material_print_temperature
speed_print = 30
speed_infill = 45
speed_wall = =speed_print
speed_topbottom = 10
speed_support = =speed_print
speed_travel = 120
retraction_amount = 6.0
retraction_speed = 20
skirt_brim_speed = =speed_print
infill_sparse_density = 10

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