mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 06:57:28 -06:00
Merge branch 'master' into mypy_fixes
Conflicts: cura/Backups/Backup.py cura/Settings/ExtruderManager.py cura/Settings/MachineManager.py
This commit is contained in:
commit
554a3fd908
232 changed files with 565 additions and 601 deletions
|
@ -3,30 +3,26 @@
|
||||||
from cura.Backups.BackupsManager import BackupsManager
|
from cura.Backups.BackupsManager import BackupsManager
|
||||||
|
|
||||||
|
|
||||||
|
## The back-ups API provides a version-proof bridge between Cura's
|
||||||
|
# BackupManager and plug-ins that hook into it.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ``from cura.API import CuraAPI
|
||||||
|
# api = CuraAPI()
|
||||||
|
# api.backups.createBackup()
|
||||||
|
# api.backups.restoreBackup(my_zip_file, {"cura_release": "3.1"})``
|
||||||
class Backups:
|
class Backups:
|
||||||
"""
|
|
||||||
The backups API provides a version-proof bridge between Cura's BackupManager and plugins that hook into it.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
from cura.API import CuraAPI
|
|
||||||
api = CuraAPI()
|
|
||||||
api.backups.createBackup()
|
|
||||||
api.backups.restoreBackup(my_zip_file, {"cura_release": "3.1"})
|
|
||||||
"""
|
|
||||||
|
|
||||||
manager = BackupsManager() # Re-used instance of the backups manager.
|
manager = BackupsManager() # Re-used instance of the backups manager.
|
||||||
|
|
||||||
|
## Create a new back-up using the BackupsManager.
|
||||||
|
# \return Tuple containing a ZIP file with the back-up data and a dict
|
||||||
|
# with metadata about the back-up.
|
||||||
def createBackup(self) -> (bytes, dict):
|
def createBackup(self) -> (bytes, dict):
|
||||||
"""
|
|
||||||
Create a new backup using the BackupsManager.
|
|
||||||
:return: Tuple containing a ZIP file with the backup data and a dict with meta data about the backup.
|
|
||||||
"""
|
|
||||||
return self.manager.createBackup()
|
return self.manager.createBackup()
|
||||||
|
|
||||||
|
## Restore a back-up using the BackupsManager.
|
||||||
|
# \param zip_file A ZIP file containing the actual back-up data.
|
||||||
|
# \param meta_data Some metadata needed for restoring a back-up, like the
|
||||||
|
# Cura version number.
|
||||||
def restoreBackup(self, zip_file: bytes, meta_data: dict) -> None:
|
def restoreBackup(self, zip_file: bytes, meta_data: dict) -> None:
|
||||||
"""
|
|
||||||
Restore a backup using the BackupManager.
|
|
||||||
:param zip_file: A ZIP file containing the actual backup data.
|
|
||||||
:param meta_data: Some meta data needed for restoring a backup, like the Cura version number.
|
|
||||||
"""
|
|
||||||
return self.manager.restoreBackup(zip_file, meta_data)
|
return self.manager.restoreBackup(zip_file, meta_data)
|
||||||
|
|
|
@ -3,14 +3,13 @@
|
||||||
from UM.PluginRegistry import PluginRegistry
|
from UM.PluginRegistry import PluginRegistry
|
||||||
from cura.API.Backups import Backups
|
from cura.API.Backups import Backups
|
||||||
|
|
||||||
|
## The official Cura API that plug-ins can use to interact with Cura.
|
||||||
|
#
|
||||||
|
# Python does not technically prevent talking to other classes as well, but
|
||||||
|
# this API provides a version-safe interface with proper deprecation warnings
|
||||||
|
# etc. Usage of any other methods than the ones provided in this API can cause
|
||||||
|
# plug-ins to be unstable.
|
||||||
class CuraAPI:
|
class CuraAPI:
|
||||||
"""
|
|
||||||
The official Cura API that plugins can use to interact with Cura.
|
|
||||||
Python does not technically prevent talking to other classes as well,
|
|
||||||
but this API provides a version-safe interface with proper deprecation warnings etc.
|
|
||||||
Usage of any other methods than the ones provided in this API can cause plugins to be unstable.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# For now we use the same API version to be consistent.
|
# For now we use the same API version to be consistent.
|
||||||
VERSION = PluginRegistry.APIVersion
|
VERSION = PluginRegistry.APIVersion
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
# Copyright (c) 2018 Ultimaker B.V.
|
# Copyright (c) 2018 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
from typing import List
|
||||||
|
|
||||||
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||||
from UM.Logger import Logger
|
from UM.Logger import Logger
|
||||||
from UM.Math.Polygon import Polygon
|
from UM.Math.Polygon import Polygon
|
||||||
from UM.Math.Vector import Vector
|
from UM.Math.Vector import Vector
|
||||||
|
from UM.Scene.SceneNode import SceneNode
|
||||||
from cura.Arranging.ShapeArray import ShapeArray
|
from cura.Arranging.ShapeArray import ShapeArray
|
||||||
from cura.Scene import ZOffsetDecorator
|
from cura.Scene import ZOffsetDecorator
|
||||||
|
|
||||||
|
@ -85,8 +87,7 @@ class Arrange:
|
||||||
# \param node
|
# \param node
|
||||||
# \param offset_shape_arr ShapeArray with offset, for placing the shape
|
# \param offset_shape_arr ShapeArray with offset, for placing the shape
|
||||||
# \param hull_shape_arr ShapeArray without offset, used to find location
|
# \param hull_shape_arr ShapeArray without offset, used to find location
|
||||||
def findNodePlacement(self, node, offset_shape_arr, hull_shape_arr, step = 1):
|
def findNodePlacement(self, node: SceneNode, offset_shape_arr: ShapeArray, hull_shape_arr: ShapeArray, step = 1):
|
||||||
new_node = copy.deepcopy(node)
|
|
||||||
best_spot = self.bestSpot(
|
best_spot = self.bestSpot(
|
||||||
hull_shape_arr, start_prio = self._last_priority, step = step)
|
hull_shape_arr, start_prio = self._last_priority, step = step)
|
||||||
x, y = best_spot.x, best_spot.y
|
x, y = best_spot.x, best_spot.y
|
||||||
|
@ -95,21 +96,21 @@ class Arrange:
|
||||||
self._last_priority = best_spot.priority
|
self._last_priority = best_spot.priority
|
||||||
|
|
||||||
# Ensure that the object is above the build platform
|
# Ensure that the object is above the build platform
|
||||||
new_node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
||||||
if new_node.getBoundingBox():
|
if node.getBoundingBox():
|
||||||
center_y = new_node.getWorldPosition().y - new_node.getBoundingBox().bottom
|
center_y = node.getWorldPosition().y - node.getBoundingBox().bottom
|
||||||
else:
|
else:
|
||||||
center_y = 0
|
center_y = 0
|
||||||
|
|
||||||
if x is not None: # We could find a place
|
if x is not None: # We could find a place
|
||||||
new_node.setPosition(Vector(x, center_y, y))
|
node.setPosition(Vector(x, center_y, y))
|
||||||
found_spot = True
|
found_spot = True
|
||||||
self.place(x, y, offset_shape_arr) # place the object in arranger
|
self.place(x, y, offset_shape_arr) # place the object in arranger
|
||||||
else:
|
else:
|
||||||
Logger.log("d", "Could not find spot!"),
|
Logger.log("d", "Could not find spot!"),
|
||||||
found_spot = False
|
found_spot = False
|
||||||
new_node.setPosition(Vector(200, center_y, 100))
|
node.setPosition(Vector(200, center_y, 100))
|
||||||
return new_node, found_spot
|
return found_spot
|
||||||
|
|
||||||
## Fill priority, center is best. Lower value is better
|
## Fill priority, center is best. Lower value is better
|
||||||
# This is a strategy for the arranger.
|
# This is a strategy for the arranger.
|
||||||
|
|
|
@ -17,12 +17,11 @@ from UM.Resources import Resources
|
||||||
from cura.CuraApplication import CuraApplication
|
from cura.CuraApplication import CuraApplication
|
||||||
|
|
||||||
|
|
||||||
|
## The back-up class holds all data about a back-up.
|
||||||
|
#
|
||||||
|
# It is also responsible for reading and writing the zip file to the user data
|
||||||
|
# folder.
|
||||||
class Backup:
|
class Backup:
|
||||||
"""
|
|
||||||
The backup class holds all data about a backup.
|
|
||||||
It is also responsible for reading and writing the zip file to the user data folder.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# These files should be ignored when making a backup.
|
# These files should be ignored when making a backup.
|
||||||
IGNORED_FILES = [r"cura\.log", r"plugins\.json", r"cache", r"__pycache__", r"\.qmlc", r"\.pyc"]
|
IGNORED_FILES = [r"cura\.log", r"plugins\.json", r"cache", r"__pycache__", r"\.qmlc", r"\.pyc"]
|
||||||
|
|
||||||
|
@ -33,10 +32,8 @@ class Backup:
|
||||||
self.zip_file = zip_file # type: Optional[bytes]
|
self.zip_file = zip_file # type: Optional[bytes]
|
||||||
self.meta_data = meta_data # type: Optional[dict]
|
self.meta_data = meta_data # type: Optional[dict]
|
||||||
|
|
||||||
|
## Create a back-up from the current user config folder.
|
||||||
def makeFromCurrent(self) -> None:
|
def makeFromCurrent(self) -> None:
|
||||||
"""
|
|
||||||
Create a backup from the current user config folder.
|
|
||||||
"""
|
|
||||||
cura_release = CuraApplication.getInstance().getVersion()
|
cura_release = CuraApplication.getInstance().getVersion()
|
||||||
version_data_dir = Resources.getDataStoragePath()
|
version_data_dir = Resources.getDataStoragePath()
|
||||||
|
|
||||||
|
@ -77,12 +74,10 @@ class Backup:
|
||||||
"plugin_count": str(plugin_count)
|
"plugin_count": str(plugin_count)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
## Make a full archive from the given root path with the given name.
|
||||||
|
# \param root_path The root directory to archive recursively.
|
||||||
|
# \return The archive as bytes.
|
||||||
def _makeArchive(self, buffer: "io.BytesIO", root_path: str) -> Optional[ZipFile]:
|
def _makeArchive(self, buffer: "io.BytesIO", root_path: str) -> Optional[ZipFile]:
|
||||||
"""
|
|
||||||
Make a full archive from the given root path with the given name.
|
|
||||||
:param root_path: The root directory to archive recursively.
|
|
||||||
:return: The archive as bytes.
|
|
||||||
"""
|
|
||||||
ignore_string = re.compile("|".join(self.IGNORED_FILES))
|
ignore_string = re.compile("|".join(self.IGNORED_FILES))
|
||||||
try:
|
try:
|
||||||
archive = ZipFile(buffer, "w", ZIP_DEFLATED)
|
archive = ZipFile(buffer, "w", ZIP_DEFLATED)
|
||||||
|
@ -101,15 +96,13 @@ class Backup:
|
||||||
"Could not create archive from user data directory: {}".format(error)))
|
"Could not create archive from user data directory: {}".format(error)))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
## Show a UI message.
|
||||||
def _showMessage(self, message: str) -> None:
|
def _showMessage(self, message: str) -> None:
|
||||||
"""Show a UI message"""
|
|
||||||
Message(message, title=self.catalog.i18nc("@info:title", "Backup"), lifetime=30).show()
|
Message(message, title=self.catalog.i18nc("@info:title", "Backup"), lifetime=30).show()
|
||||||
|
|
||||||
|
## Restore this back-up.
|
||||||
|
# \return Whether we had success or not.
|
||||||
def restore(self) -> bool:
|
def restore(self) -> bool:
|
||||||
"""
|
|
||||||
Restore this backups
|
|
||||||
:return: A boolean whether we had success or not.
|
|
||||||
"""
|
|
||||||
if not self.zip_file or not self.meta_data or not self.meta_data.get("cura_release", None):
|
if not self.zip_file or not self.meta_data or not self.meta_data.get("cura_release", None):
|
||||||
# We can restore without the minimum required information.
|
# We can restore without the minimum required information.
|
||||||
Logger.log("w", "Tried to restore a Cura backup without having proper data or meta data.")
|
Logger.log("w", "Tried to restore a Cura backup without having proper data or meta data.")
|
||||||
|
@ -142,14 +135,12 @@ class Backup:
|
||||||
|
|
||||||
return extracted
|
return extracted
|
||||||
|
|
||||||
|
## Extract the whole archive to the given target path.
|
||||||
|
# \param archive The archive as ZipFile.
|
||||||
|
# \param target_path The target path.
|
||||||
|
# \return Whether we had success or not.
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _extractArchive(archive: "ZipFile", target_path: str) -> bool:
|
def _extractArchive(archive: "ZipFile", target_path: str) -> bool:
|
||||||
"""
|
|
||||||
Extract the whole archive to the given target path.
|
|
||||||
:param archive: The archive as ZipFile.
|
|
||||||
:param target_path: The target path.
|
|
||||||
:return: A boolean whether we had success or not.
|
|
||||||
"""
|
|
||||||
Logger.log("d", "Removing current data in location: %s", target_path)
|
Logger.log("d", "Removing current data in location: %s", target_path)
|
||||||
Resources.factoryReset()
|
Resources.factoryReset()
|
||||||
Logger.log("d", "Extracting backup to location: %s", target_path)
|
Logger.log("d", "Extracting backup to location: %s", target_path)
|
||||||
|
|
|
@ -7,19 +7,18 @@ from cura.Backups.Backup import Backup
|
||||||
from cura.CuraApplication import CuraApplication
|
from cura.CuraApplication import CuraApplication
|
||||||
|
|
||||||
|
|
||||||
|
## The BackupsManager is responsible for managing the creating and restoring of
|
||||||
|
# back-ups.
|
||||||
|
#
|
||||||
|
# Back-ups themselves are represented in a different class.
|
||||||
class BackupsManager:
|
class BackupsManager:
|
||||||
"""
|
|
||||||
The BackupsManager is responsible for managing the creating and restoring of backups.
|
|
||||||
Backups themselves are represented in a different class.
|
|
||||||
"""
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._application = CuraApplication.getInstance()
|
self._application = CuraApplication.getInstance()
|
||||||
|
|
||||||
|
## Get a back-up of the current configuration.
|
||||||
|
# \return A tuple containing a ZipFile (the actual back-up) and a dict
|
||||||
|
# containing some metadata (like version).
|
||||||
def createBackup(self) -> (Optional[bytes], Optional[dict]):
|
def createBackup(self) -> (Optional[bytes], Optional[dict]):
|
||||||
"""
|
|
||||||
Get a backup of the current configuration.
|
|
||||||
:return: A Tuple containing a ZipFile (the actual backup) and a dict containing some meta data (like version).
|
|
||||||
"""
|
|
||||||
self._disableAutoSave()
|
self._disableAutoSave()
|
||||||
backup = Backup()
|
backup = Backup()
|
||||||
backup.makeFromCurrent()
|
backup.makeFromCurrent()
|
||||||
|
@ -27,12 +26,11 @@ class BackupsManager:
|
||||||
# We don't return a Backup here because we want plugins only to interact with our API and not full objects.
|
# We don't return a Backup here because we want plugins only to interact with our API and not full objects.
|
||||||
return backup.zip_file, backup.meta_data
|
return backup.zip_file, backup.meta_data
|
||||||
|
|
||||||
|
## Restore a back-up from a given ZipFile.
|
||||||
|
# \param zip_file A bytes object containing the actual back-up.
|
||||||
|
# \param meta_data A dict containing some metadata that is needed to
|
||||||
|
# restore the back-up correctly.
|
||||||
def restoreBackup(self, zip_file: bytes, meta_data: dict) -> None:
|
def restoreBackup(self, zip_file: bytes, meta_data: dict) -> None:
|
||||||
"""
|
|
||||||
Restore a backup from a given ZipFile.
|
|
||||||
:param zip_file: A bytes object containing the actual backup.
|
|
||||||
:param meta_data: A dict containing some meta data that is needed to restore the backup correctly.
|
|
||||||
"""
|
|
||||||
if not meta_data.get("cura_release", None):
|
if not meta_data.get("cura_release", None):
|
||||||
# If there is no "cura_release" specified in the meta data, we don't execute a backup restore.
|
# If there is no "cura_release" specified in the meta data, we don't execute a backup restore.
|
||||||
Logger.log("w", "Tried to restore a backup without specifying a Cura version number.")
|
Logger.log("w", "Tried to restore a backup without specifying a Cura version number.")
|
||||||
|
@ -47,10 +45,11 @@ class BackupsManager:
|
||||||
# We don't want to store the data at this point as that would override the just-restored backup.
|
# We don't want to store the data at this point as that would override the just-restored backup.
|
||||||
self._application.windowClosed(save_data=False)
|
self._application.windowClosed(save_data=False)
|
||||||
|
|
||||||
|
## Here we try to disable the auto-save plug-in as it might interfere with
|
||||||
|
# restoring a back-up.
|
||||||
def _disableAutoSave(self):
|
def _disableAutoSave(self):
|
||||||
"""Here we try to disable the auto-save plugin as it might interfere with restoring a backup."""
|
|
||||||
self._application.setSaveDataEnabled(False)
|
self._application.setSaveDataEnabled(False)
|
||||||
|
|
||||||
|
## Re-enable auto-save after we're done.
|
||||||
def _enableAutoSave(self):
|
def _enableAutoSave(self):
|
||||||
"""Re-enable auto-save after we're done."""
|
|
||||||
self._application.setSaveDataEnabled(True)
|
self._application.setSaveDataEnabled(True)
|
||||||
|
|
|
@ -225,6 +225,8 @@ class CuraApplication(QtApplication):
|
||||||
|
|
||||||
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
|
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
|
||||||
self._container_registry_class = CuraContainerRegistry
|
self._container_registry_class = CuraContainerRegistry
|
||||||
|
from cura.CuraPackageManager import CuraPackageManager
|
||||||
|
self._package_manager_class = CuraPackageManager
|
||||||
|
|
||||||
# Adds command line options to the command line parser. This should be called after the application is created and
|
# Adds command line options to the command line parser. This should be called after the application is created and
|
||||||
# before the pre-start.
|
# before the pre-start.
|
||||||
|
@ -511,7 +513,6 @@ class CuraApplication(QtApplication):
|
||||||
preferences.addPreference("cura/asked_dialog_on_project_save", False)
|
preferences.addPreference("cura/asked_dialog_on_project_save", False)
|
||||||
preferences.addPreference("cura/choice_on_profile_override", "always_ask")
|
preferences.addPreference("cura/choice_on_profile_override", "always_ask")
|
||||||
preferences.addPreference("cura/choice_on_open_project", "always_ask")
|
preferences.addPreference("cura/choice_on_open_project", "always_ask")
|
||||||
preferences.addPreference("cura/not_arrange_objects_on_load", False)
|
|
||||||
preferences.addPreference("cura/use_multi_build_plate", False)
|
preferences.addPreference("cura/use_multi_build_plate", False)
|
||||||
|
|
||||||
preferences.addPreference("cura/currency", "€")
|
preferences.addPreference("cura/currency", "€")
|
||||||
|
@ -1601,9 +1602,7 @@ class CuraApplication(QtApplication):
|
||||||
self._currently_loading_files.remove(filename)
|
self._currently_loading_files.remove(filename)
|
||||||
|
|
||||||
self.fileLoaded.emit(filename)
|
self.fileLoaded.emit(filename)
|
||||||
arrange_objects_on_load = (
|
arrange_objects_on_load = not self.getPreferences().getValue("cura/use_multi_build_plate")
|
||||||
not self.getPreferences().getValue("cura/use_multi_build_plate") or
|
|
||||||
not self.getPreferences().getValue("cura/not_arrange_objects_on_load"))
|
|
||||||
target_build_plate = self.getMultiBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1
|
target_build_plate = self.getMultiBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1
|
||||||
|
|
||||||
root = self.getController().getScene().getRoot()
|
root = self.getController().getScene().getRoot()
|
||||||
|
@ -1676,7 +1675,7 @@ class CuraApplication(QtApplication):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Step is for skipping tests to make it a lot faster. it also makes the outcome somewhat rougher
|
# Step is for skipping tests to make it a lot faster. it also makes the outcome somewhat rougher
|
||||||
node, _ = arranger.findNodePlacement(node, offset_shape_arr, hull_shape_arr, step = 10)
|
arranger.findNodePlacement(node, offset_shape_arr, hull_shape_arr, step = 10)
|
||||||
|
|
||||||
# This node is deep copied from some other node which already has a BuildPlateDecorator, but the deepcopy
|
# This node is deep copied from some other node which already has a BuildPlateDecorator, but the deepcopy
|
||||||
# of BuildPlateDecorator produces one that's associated with build plate -1. So, here we need to check if
|
# of BuildPlateDecorator produces one that's associated with build plate -1. So, here we need to check if
|
||||||
|
|
|
@ -7,8 +7,11 @@ from UM.Resources import Resources #To find storage paths for some resource type
|
||||||
|
|
||||||
|
|
||||||
class CuraPackageManager(PackageManager):
|
class CuraPackageManager(PackageManager):
|
||||||
def __init__(self, parent = None):
|
def __init__(self, application, parent = None):
|
||||||
super().__init__(parent)
|
super().__init__(application, parent)
|
||||||
|
|
||||||
|
def initialize(self):
|
||||||
self._installation_dirs_dict["materials"] = Resources.getStoragePath(CuraApplication.ResourceTypes.MaterialInstanceContainer)
|
self._installation_dirs_dict["materials"] = Resources.getStoragePath(CuraApplication.ResourceTypes.MaterialInstanceContainer)
|
||||||
self._installation_dirs_dict["qualities"] = Resources.getStoragePath(CuraApplication.ResourceTypes.QualityInstanceContainer)
|
self._installation_dirs_dict["qualities"] = Resources.getStoragePath(CuraApplication.ResourceTypes.QualityInstanceContainer)
|
||||||
|
|
||||||
|
super().initialize()
|
||||||
|
|
|
@ -64,10 +64,11 @@ class MultiplyObjectsJob(Job):
|
||||||
arranger.resetLastPriority()
|
arranger.resetLastPriority()
|
||||||
for i in range(self._count):
|
for i in range(self._count):
|
||||||
# We do place the nodes one by one, as we want to yield in between.
|
# We do place the nodes one by one, as we want to yield in between.
|
||||||
|
new_node = copy.deepcopy(node)
|
||||||
|
solution_found = False
|
||||||
if not node_too_big:
|
if not node_too_big:
|
||||||
new_node, solution_found = arranger.findNodePlacement(current_node, offset_shape_arr, hull_shape_arr)
|
solution_found = arranger.findNodePlacement(new_node, offset_shape_arr, hull_shape_arr)
|
||||||
else:
|
|
||||||
new_node = copy.deepcopy(node)
|
|
||||||
if node_too_big or not solution_found:
|
if node_too_big or not solution_found:
|
||||||
found_solution_for_all = False
|
found_solution_for_all = False
|
||||||
new_location = new_node.getPosition()
|
new_location = new_node.getPosition()
|
||||||
|
|
|
@ -8,6 +8,7 @@ from UM.Scene.SceneNode import SceneNode
|
||||||
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
||||||
from UM.Math.Vector import Vector
|
from UM.Math.Vector import Vector
|
||||||
from UM.Scene.Selection import Selection
|
from UM.Scene.Selection import Selection
|
||||||
|
from UM.Scene.SceneNodeSettings import SceneNodeSettings
|
||||||
|
|
||||||
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
|
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
|
||||||
|
|
||||||
|
@ -80,6 +81,10 @@ class PlatformPhysics:
|
||||||
|
|
||||||
# only push away objects if this node is a printing mesh
|
# only push away objects if this node is a printing mesh
|
||||||
if not node.callDecoration("isNonPrintingMesh") and Application.getInstance().getPreferences().getValue("physics/automatic_push_free"):
|
if not node.callDecoration("isNonPrintingMesh") and Application.getInstance().getPreferences().getValue("physics/automatic_push_free"):
|
||||||
|
# Do not move locked nodes
|
||||||
|
if node.getSetting(SceneNodeSettings.LockPosition):
|
||||||
|
continue
|
||||||
|
|
||||||
# Check for collisions between convex hulls
|
# Check for collisions between convex hulls
|
||||||
for other_node in BreadthFirstIterator(root):
|
for other_node in BreadthFirstIterator(root):
|
||||||
# Ignore root, ourselves and anything that is not a normal SceneNode.
|
# Ignore root, ourselves and anything that is not a normal SceneNode.
|
||||||
|
|
|
@ -42,6 +42,7 @@ class ContainerManager(QObject):
|
||||||
self._container_registry = self._application.getContainerRegistry()
|
self._container_registry = self._application.getContainerRegistry()
|
||||||
self._machine_manager = self._application.getMachineManager()
|
self._machine_manager = self._application.getMachineManager()
|
||||||
self._material_manager = self._application.getMaterialManager()
|
self._material_manager = self._application.getMaterialManager()
|
||||||
|
self._quality_manager = self._application.getQualityManager()
|
||||||
self._container_name_filters = {}
|
self._container_name_filters = {}
|
||||||
|
|
||||||
@pyqtSlot(str, str, result=str)
|
@pyqtSlot(str, str, result=str)
|
||||||
|
@ -312,11 +313,19 @@ class ContainerManager(QObject):
|
||||||
|
|
||||||
self._machine_manager.blurSettings.emit()
|
self._machine_manager.blurSettings.emit()
|
||||||
|
|
||||||
global_stack = self._machine_manager.activeMachine
|
current_quality_changes_name = global_stack.qualityChanges.getName()
|
||||||
|
current_quality_type = global_stack.quality.getMetaDataEntry("quality_type")
|
||||||
extruder_stacks = list(global_stack.extruders.values())
|
extruder_stacks = list(global_stack.extruders.values())
|
||||||
for stack in [global_stack] + extruder_stacks:
|
for stack in [global_stack] + extruder_stacks:
|
||||||
# Find the quality_changes container for this stack and merge the contents of the top container into it.
|
# Find the quality_changes container for this stack and merge the contents of the top container into it.
|
||||||
quality_changes = stack.qualityChanges
|
quality_changes = stack.qualityChanges
|
||||||
|
|
||||||
|
if quality_changes.getId() == "empty_quality_changes":
|
||||||
|
quality_changes = self._quality_manager._createQualityChanges(current_quality_type, current_quality_changes_name,
|
||||||
|
global_stack, stack)
|
||||||
|
self._container_registry.addContainer(quality_changes)
|
||||||
|
stack.qualityChanges = quality_changes
|
||||||
|
|
||||||
if not quality_changes or self._container_registry.isReadOnly(quality_changes.getId()):
|
if not quality_changes or self._container_registry.isReadOnly(quality_changes.getId()):
|
||||||
Logger.log("e", "Could not update quality of a nonexistant or read only quality profile in stack %s", stack.getId())
|
Logger.log("e", "Could not update quality of a nonexistant or read only quality profile in stack %s", stack.getId())
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -467,10 +467,6 @@ class ExtruderManager(QObject):
|
||||||
if global_stack.definitionChanges.hasProperty(key, "value"):
|
if global_stack.definitionChanges.hasProperty(key, "value"):
|
||||||
global_stack.definitionChanges.removeInstance(key, postpone_emit = True)
|
global_stack.definitionChanges.removeInstance(key, postpone_emit = True)
|
||||||
|
|
||||||
# Update material diameter for extruders
|
|
||||||
for position in extruder_positions_to_update:
|
|
||||||
self.updateMaterialForDiameter(position, global_stack = global_stack)
|
|
||||||
|
|
||||||
## Get all extruder values for a certain setting.
|
## Get all extruder values for a certain setting.
|
||||||
#
|
#
|
||||||
# This is exposed to SettingFunction so it can be used in value functions.
|
# This is exposed to SettingFunction so it can be used in value functions.
|
||||||
|
@ -562,96 +558,6 @@ class ExtruderManager(QObject):
|
||||||
def getInstanceExtruderValues(self, key):
|
def getInstanceExtruderValues(self, key):
|
||||||
return ExtruderManager.getExtruderValues(key)
|
return ExtruderManager.getExtruderValues(key)
|
||||||
|
|
||||||
## Updates the material container to a material that matches the material diameter set for the printer
|
|
||||||
def updateMaterialForDiameter(self, extruder_position: int, global_stack = None):
|
|
||||||
if not global_stack:
|
|
||||||
global_stack = self._application.getGlobalContainerStack()
|
|
||||||
if not global_stack:
|
|
||||||
return
|
|
||||||
|
|
||||||
if not global_stack.getMetaDataEntry("has_materials", False):
|
|
||||||
return
|
|
||||||
|
|
||||||
extruder_stack = global_stack.extruders[str(extruder_position)]
|
|
||||||
|
|
||||||
material_diameter = extruder_stack.material.getProperty("material_diameter", "value")
|
|
||||||
if not material_diameter:
|
|
||||||
# in case of "empty" material
|
|
||||||
material_diameter = 0
|
|
||||||
|
|
||||||
material_approximate_diameter = str(round(material_diameter))
|
|
||||||
material_diameter = extruder_stack.definitionChanges.getProperty("material_diameter", "value")
|
|
||||||
setting_provider = extruder_stack
|
|
||||||
if not material_diameter:
|
|
||||||
if extruder_stack.definition.hasProperty("material_diameter", "value"):
|
|
||||||
material_diameter = extruder_stack.definition.getProperty("material_diameter", "value")
|
|
||||||
else:
|
|
||||||
material_diameter = global_stack.definition.getProperty("material_diameter", "value")
|
|
||||||
setting_provider = global_stack
|
|
||||||
|
|
||||||
if isinstance(material_diameter, SettingFunction):
|
|
||||||
material_diameter = material_diameter(setting_provider)
|
|
||||||
|
|
||||||
machine_approximate_diameter = str(round(material_diameter))
|
|
||||||
|
|
||||||
if material_approximate_diameter != machine_approximate_diameter:
|
|
||||||
Logger.log("i", "The the currently active material(s) do not match the diameter set for the printer. Finding alternatives.")
|
|
||||||
|
|
||||||
if global_stack.getMetaDataEntry("has_machine_materials", False):
|
|
||||||
materials_definition = global_stack.definition.getId()
|
|
||||||
has_material_variants = global_stack.getMetaDataEntry("has_variants", False)
|
|
||||||
else:
|
|
||||||
materials_definition = "fdmprinter"
|
|
||||||
has_material_variants = False
|
|
||||||
|
|
||||||
old_material = extruder_stack.material
|
|
||||||
search_criteria = {
|
|
||||||
"type": "material",
|
|
||||||
"approximate_diameter": machine_approximate_diameter,
|
|
||||||
"material": old_material.getMetaDataEntry("material", "value"),
|
|
||||||
"brand": old_material.getMetaDataEntry("brand", "value"),
|
|
||||||
"supplier": old_material.getMetaDataEntry("supplier", "value"),
|
|
||||||
"color_name": old_material.getMetaDataEntry("color_name", "value"),
|
|
||||||
"definition": materials_definition
|
|
||||||
}
|
|
||||||
if has_material_variants:
|
|
||||||
search_criteria["variant"] = extruder_stack.variant.getId()
|
|
||||||
|
|
||||||
container_registry = self._application.getContainerRegistry()
|
|
||||||
empty_material = container_registry.findInstanceContainers(id = "empty_material")[0]
|
|
||||||
|
|
||||||
if old_material == empty_material:
|
|
||||||
search_criteria.pop("material", None)
|
|
||||||
search_criteria.pop("supplier", None)
|
|
||||||
search_criteria.pop("brand", None)
|
|
||||||
search_criteria.pop("definition", None)
|
|
||||||
search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material")
|
|
||||||
|
|
||||||
materials = container_registry.findInstanceContainers(**search_criteria)
|
|
||||||
if not materials:
|
|
||||||
# Same material with new diameter is not found, search for generic version of the same material type
|
|
||||||
search_criteria.pop("supplier", None)
|
|
||||||
search_criteria.pop("brand", None)
|
|
||||||
search_criteria["color_name"] = "Generic"
|
|
||||||
materials = container_registry.findInstanceContainers(**search_criteria)
|
|
||||||
if not materials:
|
|
||||||
# Generic material with new diameter is not found, search for preferred material
|
|
||||||
search_criteria.pop("color_name", None)
|
|
||||||
search_criteria.pop("material", None)
|
|
||||||
search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material")
|
|
||||||
materials = container_registry.findInstanceContainers(**search_criteria)
|
|
||||||
if not materials:
|
|
||||||
# Preferred material with new diameter is not found, search for any material
|
|
||||||
search_criteria.pop("id", None)
|
|
||||||
materials = container_registry.findInstanceContainers(**search_criteria)
|
|
||||||
if not materials:
|
|
||||||
# Just use empty material as a final fallback
|
|
||||||
materials = [empty_material]
|
|
||||||
|
|
||||||
Logger.log("i", "Selecting new material: %s", materials[0].getId())
|
|
||||||
|
|
||||||
extruder_stack.material = materials[0]
|
|
||||||
|
|
||||||
## Get the value for a setting from a specific extruder.
|
## Get the value for a setting from a specific extruder.
|
||||||
#
|
#
|
||||||
# This is exposed to SettingFunction to use in value functions.
|
# This is exposed to SettingFunction to use in value functions.
|
||||||
|
|
|
@ -307,6 +307,11 @@ class MachineManager(QObject):
|
||||||
for position, extruder in global_stack.extruders.items():
|
for position, extruder in global_stack.extruders.items():
|
||||||
material_dict[position] = extruder.material.getMetaDataEntry("base_file")
|
material_dict[position] = extruder.material.getMetaDataEntry("base_file")
|
||||||
self._current_root_material_id = material_dict
|
self._current_root_material_id = material_dict
|
||||||
|
|
||||||
|
# Update materials to make sure that the diameters match with the machine's
|
||||||
|
for position in global_stack.extruders:
|
||||||
|
self.updateMaterialWithVariant(position)
|
||||||
|
|
||||||
global_quality = global_stack.quality
|
global_quality = global_stack.quality
|
||||||
quality_type = global_quality.getMetaDataEntry("quality_type")
|
quality_type = global_quality.getMetaDataEntry("quality_type")
|
||||||
global_quality_changes = global_stack.qualityChanges
|
global_quality_changes = global_stack.qualityChanges
|
||||||
|
@ -1235,7 +1240,7 @@ class MachineManager(QObject):
|
||||||
current_quality_type, quality_type)
|
current_quality_type, quality_type)
|
||||||
self._setQualityGroup(candidate_quality_groups[quality_type], empty_quality_changes = True)
|
self._setQualityGroup(candidate_quality_groups[quality_type], empty_quality_changes = True)
|
||||||
|
|
||||||
def _updateMaterialWithVariant(self, position: Optional[str]) -> None:
|
def updateMaterialWithVariant(self, position: Optional[str]) -> None:
|
||||||
if self._global_container_stack is None:
|
if self._global_container_stack is None:
|
||||||
return
|
return
|
||||||
if position is None:
|
if position is None:
|
||||||
|
@ -1323,7 +1328,7 @@ class MachineManager(QObject):
|
||||||
self._setMaterial(position, material_container_node)
|
self._setMaterial(position, material_container_node)
|
||||||
else:
|
else:
|
||||||
self._global_container_stack.extruders[position].material = self._empty_material_container
|
self._global_container_stack.extruders[position].material = self._empty_material_container
|
||||||
self._updateMaterialWithVariant(position)
|
self.updateMaterialWithVariant(position)
|
||||||
|
|
||||||
if configuration.buildplateConfiguration is not None:
|
if configuration.buildplateConfiguration is not None:
|
||||||
global_variant_container_node = self._variant_manager.getBuildplateVariantNode(self._global_container_stack.definition.getId(), configuration.buildplateConfiguration)
|
global_variant_container_node = self._variant_manager.getBuildplateVariantNode(self._global_container_stack.definition.getId(), configuration.buildplateConfiguration)
|
||||||
|
@ -1369,7 +1374,7 @@ class MachineManager(QObject):
|
||||||
self.blurSettings.emit()
|
self.blurSettings.emit()
|
||||||
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
||||||
self._setGlobalVariant(container_node)
|
self._setGlobalVariant(container_node)
|
||||||
self._updateMaterialWithVariant(None) # Update all materials
|
self.updateMaterialWithVariant(None) # Update all materials
|
||||||
self._updateQualityWithMaterial()
|
self._updateQualityWithMaterial()
|
||||||
|
|
||||||
@pyqtSlot(str, str)
|
@pyqtSlot(str, str)
|
||||||
|
@ -1410,7 +1415,7 @@ class MachineManager(QObject):
|
||||||
self.blurSettings.emit()
|
self.blurSettings.emit()
|
||||||
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
||||||
self._setVariantNode(position, container_node)
|
self._setVariantNode(position, container_node)
|
||||||
self._updateMaterialWithVariant(position)
|
self.updateMaterialWithVariant(position)
|
||||||
self._updateQualityWithMaterial()
|
self._updateQualityWithMaterial()
|
||||||
|
|
||||||
# See if we need to show the Discard or Keep changes screen
|
# See if we need to show the Discard or Keep changes screen
|
||||||
|
@ -1476,5 +1481,5 @@ class MachineManager(QObject):
|
||||||
if self._global_container_stack is None:
|
if self._global_container_stack is None:
|
||||||
return
|
return
|
||||||
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
||||||
self._updateMaterialWithVariant(None)
|
self.updateMaterialWithVariant(None)
|
||||||
self._updateQualityWithMaterial()
|
self._updateQualityWithMaterial()
|
||||||
|
|
|
@ -63,7 +63,7 @@ class SettingOverrideDecorator(SceneNodeDecorator):
|
||||||
instance_container = copy.deepcopy(self._stack.getContainer(0), memo)
|
instance_container = copy.deepcopy(self._stack.getContainer(0), memo)
|
||||||
|
|
||||||
# A unique name must be added, or replaceContainer will not replace it
|
# A unique name must be added, or replaceContainer will not replace it
|
||||||
instance_container.setMetaDataEntry("id", self._generateUniqueName)
|
instance_container.setMetaDataEntry("id", self._generateUniqueName())
|
||||||
|
|
||||||
## Set the copied instance as the first (and only) instance container of the stack.
|
## Set the copied instance as the first (and only) instance container of the stack.
|
||||||
deep_copy._stack.replaceContainer(0, instance_container)
|
deep_copy._stack.replaceContainer(0, instance_container)
|
||||||
|
|
|
@ -13,6 +13,7 @@ from UM.Workspace.WorkspaceReader import WorkspaceReader
|
||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
|
|
||||||
from UM.Logger import Logger
|
from UM.Logger import Logger
|
||||||
|
from UM.Message import Message
|
||||||
from UM.i18n import i18nCatalog
|
from UM.i18n import i18nCatalog
|
||||||
from UM.Signal import postponeSignals, CompressTechnique
|
from UM.Signal import postponeSignals, CompressTechnique
|
||||||
from UM.Settings.ContainerFormatError import ContainerFormatError
|
from UM.Settings.ContainerFormatError import ContainerFormatError
|
||||||
|
@ -470,6 +471,20 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
||||||
Logger.log("w", "File %s is not a valid workspace.", file_name)
|
Logger.log("w", "File %s is not a valid workspace.", file_name)
|
||||||
return WorkspaceReader.PreReadResult.failed
|
return WorkspaceReader.PreReadResult.failed
|
||||||
|
|
||||||
|
# Check if the machine definition exists. If not, indicate failure because we do not import definition files.
|
||||||
|
def_results = self._container_registry.findDefinitionContainersMetadata(id = machine_definition_id)
|
||||||
|
if not def_results:
|
||||||
|
message = Message(i18n_catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!",
|
||||||
|
"Project file <filename>{0}</filename> contains an unknown machine type"
|
||||||
|
" <message>{1}</message>. Cannot import the machine."
|
||||||
|
" Models will be imported instead.", file_name, machine_definition_id),
|
||||||
|
title = i18n_catalog.i18nc("@info:title", "Open Project File"))
|
||||||
|
message.show()
|
||||||
|
|
||||||
|
Logger.log("i", "Could unknown machine definition %s in project file %s, cannot import it.",
|
||||||
|
self._machine_info.definition_id, file_name)
|
||||||
|
return WorkspaceReader.PreReadResult.failed
|
||||||
|
|
||||||
# In case we use preRead() to check if a file is a valid project file, we don't want to show a dialog.
|
# In case we use preRead() to check if a file is a valid project file, we don't want to show a dialog.
|
||||||
if not show_dialog:
|
if not show_dialog:
|
||||||
return WorkspaceReader.PreReadResult.accepted
|
return WorkspaceReader.PreReadResult.accepted
|
||||||
|
|
|
@ -55,7 +55,7 @@ class ChangeLog(Extension, QObject,):
|
||||||
|
|
||||||
def loadChangeLogs(self):
|
def loadChangeLogs(self):
|
||||||
self._change_logs = collections.OrderedDict()
|
self._change_logs = collections.OrderedDict()
|
||||||
with open(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ChangeLog.txt"), "r",-1, "utf-8") as f:
|
with open(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ChangeLog.txt"), "r", encoding = "utf-8") as f:
|
||||||
open_version = None
|
open_version = None
|
||||||
open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog
|
open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog
|
||||||
for line in f:
|
for line in f:
|
||||||
|
|
|
@ -379,6 +379,14 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
else:
|
else:
|
||||||
self.backendStateChange.emit(BackendState.NotStarted)
|
self.backendStateChange.emit(BackendState.NotStarted)
|
||||||
|
|
||||||
|
if job.getResult() == StartSliceJob.StartJobResult.ObjectsWithDisabledExtruder:
|
||||||
|
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice because there are objects associated with disabled Extruder %s." % job.getMessage()),
|
||||||
|
title = catalog.i18nc("@info:title", "Unable to slice"))
|
||||||
|
self._error_message.show()
|
||||||
|
self.backendStateChange.emit(BackendState.Error)
|
||||||
|
self.backendError.emit(job)
|
||||||
|
return
|
||||||
|
|
||||||
if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice:
|
if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice:
|
||||||
if Application.getInstance().platformActivity:
|
if Application.getInstance().platformActivity:
|
||||||
self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."),
|
self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."),
|
||||||
|
|
|
@ -32,6 +32,7 @@ class StartJobResult(IntEnum):
|
||||||
MaterialIncompatible = 5
|
MaterialIncompatible = 5
|
||||||
BuildPlateError = 6
|
BuildPlateError = 6
|
||||||
ObjectSettingError = 7 #When an error occurs in per-object settings.
|
ObjectSettingError = 7 #When an error occurs in per-object settings.
|
||||||
|
ObjectsWithDisabledExtruder = 8
|
||||||
|
|
||||||
|
|
||||||
## Formatter class that handles token expansion in start/end gcod
|
## Formatter class that handles token expansion in start/end gcod
|
||||||
|
@ -213,16 +214,27 @@ class StartSliceJob(Job):
|
||||||
|
|
||||||
extruders_enabled = {position: stack.isEnabled for position, stack in Application.getInstance().getGlobalContainerStack().extruders.items()}
|
extruders_enabled = {position: stack.isEnabled for position, stack in Application.getInstance().getGlobalContainerStack().extruders.items()}
|
||||||
filtered_object_groups = []
|
filtered_object_groups = []
|
||||||
|
has_model_with_disabled_extruders = False
|
||||||
|
associated_siabled_extruders = set()
|
||||||
for group in object_groups:
|
for group in object_groups:
|
||||||
stack = Application.getInstance().getGlobalContainerStack()
|
stack = Application.getInstance().getGlobalContainerStack()
|
||||||
skip_group = False
|
skip_group = False
|
||||||
for node in group:
|
for node in group:
|
||||||
if not extruders_enabled[node.callDecoration("getActiveExtruderPosition")]:
|
extruder_position = node.callDecoration("getActiveExtruderPosition")
|
||||||
|
if not extruders_enabled[extruder_position]:
|
||||||
skip_group = True
|
skip_group = True
|
||||||
|
has_model_with_disabled_extruders = True
|
||||||
|
associated_siabled_extruders.add(extruder_position)
|
||||||
break
|
break
|
||||||
if not skip_group:
|
if not skip_group:
|
||||||
filtered_object_groups.append(group)
|
filtered_object_groups.append(group)
|
||||||
|
|
||||||
|
if has_model_with_disabled_extruders:
|
||||||
|
self.setResult(StartJobResult.ObjectsWithDisabledExtruder)
|
||||||
|
associated_siabled_extruders = [str(c) for c in sorted([int(p) + 1 for p in associated_siabled_extruders])]
|
||||||
|
self.setMessage(", ".join(associated_siabled_extruders))
|
||||||
|
return
|
||||||
|
|
||||||
# There are cases when there is nothing to slice. This can happen due to one at a time slicing not being
|
# There are cases when there is nothing to slice. This can happen due to one at a time slicing not being
|
||||||
# able to find a possible sequence or because there are no objects on the build plate (or they are outside
|
# able to find a possible sequence or because there are no objects on the build plate (or they are outside
|
||||||
# the build volume)
|
# the build volume)
|
||||||
|
|
|
@ -57,7 +57,7 @@ class GCodeProfileReader(ProfileReader):
|
||||||
# TODO: Consider moving settings to the start?
|
# TODO: Consider moving settings to the start?
|
||||||
serialized = "" # Will be filled with the serialized profile.
|
serialized = "" # Will be filled with the serialized profile.
|
||||||
try:
|
try:
|
||||||
with open(file_name, "r") as f:
|
with open(file_name, "r", encoding = "utf-8") as f:
|
||||||
for line in f:
|
for line in f:
|
||||||
if line.startswith(prefix):
|
if line.startswith(prefix):
|
||||||
# Remove the prefix and the newline from the line and add it to the rest.
|
# Remove the prefix and the newline from the line and add it to the rest.
|
||||||
|
|
|
@ -100,7 +100,7 @@ class LegacyProfileReader(ProfileReader):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with open(os.path.join(PluginRegistry.getInstance().getPluginPath("LegacyProfileReader"), "DictionaryOfDoom.json"), "r", -1, "utf-8") as f:
|
with open(os.path.join(PluginRegistry.getInstance().getPluginPath("LegacyProfileReader"), "DictionaryOfDoom.json"), "r", encoding = "utf-8") as f:
|
||||||
dict_of_doom = json.load(f) # Parse the Dictionary of Doom.
|
dict_of_doom = json.load(f) # Parse the Dictionary of Doom.
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
Logger.log("e", "Could not open DictionaryOfDoom.json for reading: %s", str(e))
|
Logger.log("e", "Could not open DictionaryOfDoom.json for reading: %s", str(e))
|
||||||
|
|
|
@ -158,4 +158,4 @@ class MachineSettingsAction(MachineAction):
|
||||||
@pyqtSlot(int)
|
@pyqtSlot(int)
|
||||||
def updateMaterialForDiameter(self, extruder_position: int):
|
def updateMaterialForDiameter(self, extruder_position: int):
|
||||||
# Updates the material container to a material that matches the material diameter set for the printer
|
# Updates the material container to a material that matches the material diameter set for the printer
|
||||||
self._application.getExtruderManager().updateMaterialForDiameter(extruder_position)
|
self._application.getMachineManager().updateMaterialWithVariant(str(extruder_position))
|
||||||
|
|
|
@ -53,7 +53,7 @@ UM.PointingRectangle {
|
||||||
verticalCenter: parent.verticalCenter
|
verticalCenter: parent.verticalCenter
|
||||||
}
|
}
|
||||||
|
|
||||||
width: 40 * screenScaleFactor
|
width: maximumValue.toString().length * 12 * screenScaleFactor
|
||||||
text: sliderLabelRoot.value + startFrom // the current handle value, add 1 because layers is an array
|
text: sliderLabelRoot.value + startFrom // the current handle value, add 1 because layers is an array
|
||||||
horizontalAlignment: TextInput.AlignRight
|
horizontalAlignment: TextInput.AlignRight
|
||||||
|
|
||||||
|
@ -77,11 +77,12 @@ UM.PointingRectangle {
|
||||||
if (valueLabel.text != "") {
|
if (valueLabel.text != "") {
|
||||||
// -startFrom because we need to convert back to an array structure
|
// -startFrom because we need to convert back to an array structure
|
||||||
sliderLabelRoot.setValue(parseInt(valueLabel.text) - startFrom)
|
sliderLabelRoot.setValue(parseInt(valueLabel.text) - startFrom)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
validator: IntValidator {
|
validator: IntValidator {
|
||||||
bottom:startFrom
|
bottom: startFrom
|
||||||
top: sliderLabelRoot.maximumValue + startFrom // +startFrom because maybe we want to start in a different value rather than 0
|
top: sliderLabelRoot.maximumValue + startFrom // +startFrom because maybe we want to start in a different value rather than 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -262,12 +262,14 @@ class Toolbox(QObject, Extension):
|
||||||
# list of old plugins
|
# list of old plugins
|
||||||
old_plugin_ids = self._plugin_registry.getInstalledPlugins()
|
old_plugin_ids = self._plugin_registry.getInstalledPlugins()
|
||||||
installed_package_ids = self._package_manager.getAllInstalledPackageIDs()
|
installed_package_ids = self._package_manager.getAllInstalledPackageIDs()
|
||||||
|
scheduled_to_remove_package_ids = self._package_manager.getToRemovePackageIDs()
|
||||||
|
|
||||||
self._old_plugin_ids = []
|
self._old_plugin_ids = []
|
||||||
self._old_plugin_metadata = []
|
self._old_plugin_metadata = []
|
||||||
|
|
||||||
for plugin_id in old_plugin_ids:
|
for plugin_id in old_plugin_ids:
|
||||||
if plugin_id not in installed_package_ids:
|
# Neither the installed packages nor the packages that are scheduled to remove are old plugins
|
||||||
|
if plugin_id not in installed_package_ids and plugin_id not in scheduled_to_remove_package_ids:
|
||||||
Logger.log('i', 'Found a plugin that was installed with the old plugin browser: %s', plugin_id)
|
Logger.log('i', 'Found a plugin that was installed with the old plugin browser: %s', plugin_id)
|
||||||
|
|
||||||
old_metadata = self._plugin_registry.getMetaData(plugin_id)
|
old_metadata = self._plugin_registry.getMetaData(plugin_id)
|
||||||
|
|
|
@ -13,7 +13,7 @@ def readHex(filename):
|
||||||
"""
|
"""
|
||||||
data = []
|
data = []
|
||||||
extra_addr = 0
|
extra_addr = 0
|
||||||
f = io.open(filename, "r")
|
f = io.open(filename, "r", encoding = "utf-8")
|
||||||
for line in f:
|
for line in f:
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if len(line) < 1:
|
if len(line) < 1:
|
||||||
|
|
|
@ -94,7 +94,7 @@ class VersionUpgrade22to24(VersionUpgrade):
|
||||||
if variant_path.endswith("_variant.inst.cfg"):
|
if variant_path.endswith("_variant.inst.cfg"):
|
||||||
variant_path = variant_path[:-len("_variant.inst.cfg")] + "_settings.inst.cfg"
|
variant_path = variant_path[:-len("_variant.inst.cfg")] + "_settings.inst.cfg"
|
||||||
|
|
||||||
with open(os.path.join(machine_instances_dir, os.path.basename(variant_path)), "w") as fp:
|
with open(os.path.join(machine_instances_dir, os.path.basename(variant_path)), "w", encoding = "utf-8") as fp:
|
||||||
variant_config.write(fp)
|
variant_config.write(fp)
|
||||||
|
|
||||||
return config_name
|
return config_name
|
||||||
|
@ -105,9 +105,9 @@ class VersionUpgrade22to24(VersionUpgrade):
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
for entry in os.scandir(variants_dir):
|
for entry in os.scandir(variants_dir):
|
||||||
if entry.name.endswith('.inst.cfg') and entry.is_file():
|
if entry.name.endswith(".inst.cfg") and entry.is_file():
|
||||||
config = configparser.ConfigParser(interpolation = None)
|
config = configparser.ConfigParser(interpolation = None)
|
||||||
with open(entry.path, "r") as fhandle:
|
with open(entry.path, "r", encoding = "utf-8") as fhandle:
|
||||||
config.read_file(fhandle)
|
config.read_file(fhandle)
|
||||||
if config.has_section("general") and config.has_option("general", "name"):
|
if config.has_section("general") and config.has_option("general", "name"):
|
||||||
result.append( { "path": entry.path, "name": config.get("general", "name") } )
|
result.append( { "path": entry.path, "name": config.get("general", "name") } )
|
||||||
|
|
|
@ -249,11 +249,11 @@ class VersionUpgrade25to26(VersionUpgrade):
|
||||||
definition_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.DefinitionChangesContainer)
|
definition_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.DefinitionChangesContainer)
|
||||||
user_settings_dir = Resources.getPath(CuraApplication.ResourceTypes.UserInstanceContainer)
|
user_settings_dir = Resources.getPath(CuraApplication.ResourceTypes.UserInstanceContainer)
|
||||||
|
|
||||||
with open(os.path.join(definition_changes_dir, definition_changes_filename), "w") as f:
|
with open(os.path.join(definition_changes_dir, definition_changes_filename), "w", encoding = "utf-8") as f:
|
||||||
f.write(definition_changes_output.getvalue())
|
f.write(definition_changes_output.getvalue())
|
||||||
with open(os.path.join(user_settings_dir, user_settings_filename), "w") as f:
|
with open(os.path.join(user_settings_dir, user_settings_filename), "w", encoding = "utf-8") as f:
|
||||||
f.write(user_settings_output.getvalue())
|
f.write(user_settings_output.getvalue())
|
||||||
with open(os.path.join(extruder_stack_dir, extruder_filename), "w") as f:
|
with open(os.path.join(extruder_stack_dir, extruder_filename), "w", encoding = "utf-8") as f:
|
||||||
f.write(extruder_output.getvalue())
|
f.write(extruder_output.getvalue())
|
||||||
|
|
||||||
## Creates a definition changes container which doesn't contain anything for the Custom FDM Printers.
|
## Creates a definition changes container which doesn't contain anything for the Custom FDM Printers.
|
||||||
|
|
|
@ -1018,7 +1018,7 @@ class XmlMaterialProfile(InstanceContainer):
|
||||||
@classmethod
|
@classmethod
|
||||||
def getProductIdMap(cls) -> Dict[str, List[str]]:
|
def getProductIdMap(cls) -> Dict[str, List[str]]:
|
||||||
product_to_id_file = os.path.join(os.path.dirname(sys.modules[cls.__module__].__file__), "product_to_id.json")
|
product_to_id_file = os.path.join(os.path.dirname(sys.modules[cls.__module__].__file__), "product_to_id.json")
|
||||||
with open(product_to_id_file) as f:
|
with open(product_to_id_file, encoding = "utf-8") as f:
|
||||||
product_to_id_map = json.load(f)
|
product_to_id_map = json.load(f)
|
||||||
product_to_id_map = {key: [value] for key, value in product_to_id_map.items()}
|
product_to_id_map = {key: [value] for key, value in product_to_id_map.items()}
|
||||||
return product_to_id_map
|
return product_to_id_map
|
||||||
|
|
|
@ -170,7 +170,7 @@ UM.PreferencesPage
|
||||||
append({ text: "日本語", code: "ja_JP" })
|
append({ text: "日本語", code: "ja_JP" })
|
||||||
append({ text: "한국어", code: "ko_KR" })
|
append({ text: "한국어", code: "ko_KR" })
|
||||||
append({ text: "Nederlands", code: "nl_NL" })
|
append({ text: "Nederlands", code: "nl_NL" })
|
||||||
append({ text: "Polski", code: "pl_PL" })
|
//Polish is disabled for being incomplete: append({ text: "Polski", code: "pl_PL" })
|
||||||
append({ text: "Português do Brasil", code: "pt_BR" })
|
append({ text: "Português do Brasil", code: "pt_BR" })
|
||||||
append({ text: "Português", code: "pt_PT" })
|
append({ text: "Português", code: "pt_PT" })
|
||||||
append({ text: "Русский", code: "ru_RU" })
|
append({ text: "Русский", code: "ru_RU" })
|
||||||
|
@ -741,21 +741,6 @@ UM.PreferencesPage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UM.TooltipArea
|
|
||||||
{
|
|
||||||
width: childrenRect.width
|
|
||||||
height: childrenRect.height
|
|
||||||
text: catalog.i18nc("@info:tooltip", "Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)")
|
|
||||||
|
|
||||||
CheckBox
|
|
||||||
{
|
|
||||||
id: arrangeOnLoadCheckbox
|
|
||||||
text: catalog.i18nc("@option:check", "Do not arrange objects on load")
|
|
||||||
checked: boolCheck(UM.Preferences.getValue("cura/not_arrange_objects_on_load"))
|
|
||||||
onCheckedChanged: UM.Preferences.setValue("cura/not_arrange_objects_on_load", checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections
|
Connections
|
||||||
{
|
{
|
||||||
target: UM.Preferences
|
target: UM.Preferences
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 80
|
speed_print = 80
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 80)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 80
|
speed_print = 80
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 80)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 80
|
speed_print = 80
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 80)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -17,6 +17,6 @@ top_bottom_thickness = 0.8
|
||||||
infill_sparse_density = 20
|
infill_sparse_density = 20
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -41,13 +41,13 @@ retraction_speed = 40
|
||||||
skirt_brim_speed = 40
|
skirt_brim_speed = 40
|
||||||
skirt_gap = 5
|
skirt_gap = 5
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_infill = 60
|
speed_infill = =speed_print
|
||||||
speed_print = 60
|
speed_print = 60
|
||||||
speed_support = 60
|
speed_support = 60
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||||
speed_travel = 100
|
speed_travel = 100
|
||||||
speed_wall = 60
|
speed_wall = =speed_print
|
||||||
speed_wall_x = 60
|
speed_wall_x = =speed_print
|
||||||
support_angle = 60
|
support_angle = 60
|
||||||
support_enable = True
|
support_enable = True
|
||||||
support_interface_enable = True
|
support_interface_enable = True
|
||||||
|
|
|
@ -41,13 +41,13 @@ retraction_speed = 40
|
||||||
skirt_brim_speed = 40
|
skirt_brim_speed = 40
|
||||||
skirt_gap = 5
|
skirt_gap = 5
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_infill = 50
|
speed_infill = =speed_print
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_support = 30
|
speed_support = 30
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
speed_travel = 50
|
speed_travel = 50
|
||||||
speed_wall = 50
|
speed_wall = =speed_print
|
||||||
speed_wall_x = 50
|
speed_wall_x = =speed_print
|
||||||
support_angle = 60
|
support_angle = 60
|
||||||
support_enable = True
|
support_enable = True
|
||||||
support_interface_enable = True
|
support_interface_enable = True
|
||||||
|
|
|
@ -41,13 +41,13 @@ retraction_speed = 40
|
||||||
skirt_brim_speed = 40
|
skirt_brim_speed = 40
|
||||||
skirt_gap = 5
|
skirt_gap = 5
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_infill = 50
|
speed_infill = =speed_print
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_support = 30
|
speed_support = 30
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
speed_travel = 100
|
speed_travel = 100
|
||||||
speed_wall = 50
|
speed_wall = =speed_print
|
||||||
speed_wall_x = 50
|
speed_wall_x = =speed_print
|
||||||
support_angle = 60
|
support_angle = 60
|
||||||
support_enable = True
|
support_enable = True
|
||||||
support_interface_enable = True
|
support_interface_enable = True
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[general]
|
[general]
|
||||||
version = 4
|
version = 4
|
||||||
name = Coarse Quality
|
name = Coarse
|
||||||
definition = fdmprinter
|
definition = fdmprinter
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
|
|
|
@ -43,11 +43,11 @@ skirt_brim_minimal_length = 75
|
||||||
skirt_gap = 1.5
|
skirt_gap = 1.5
|
||||||
skirt_line_count = 5
|
skirt_line_count = 5
|
||||||
speed_infill = =speed_print
|
speed_infill = =speed_print
|
||||||
speed_layer_0 = 25
|
speed_layer_0 = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = 40
|
speed_topbottom = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_travel = 200
|
speed_travel = 200
|
||||||
speed_wall_0 = 40
|
speed_wall_0 = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_x = =speed_print
|
speed_wall_x = =speed_print
|
||||||
support_angle = 70
|
support_angle = 70
|
||||||
support_type = buildplate
|
support_type = buildplate
|
||||||
|
|
|
@ -43,11 +43,11 @@ skirt_brim_minimal_length = 75
|
||||||
skirt_gap = 1.5
|
skirt_gap = 1.5
|
||||||
skirt_line_count = 5
|
skirt_line_count = 5
|
||||||
speed_infill = =speed_print
|
speed_infill = =speed_print
|
||||||
speed_layer_0 = 25
|
speed_layer_0 = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = 40
|
speed_topbottom = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_travel = 200
|
speed_travel = 200
|
||||||
speed_wall_0 = 40
|
speed_wall_0 = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_x = =speed_print
|
speed_wall_x = =speed_print
|
||||||
support_angle = 70
|
support_angle = 70
|
||||||
support_type = buildplate
|
support_type = buildplate
|
||||||
|
|
|
@ -43,11 +43,11 @@ skirt_brim_minimal_length = 75
|
||||||
skirt_gap = 1.5
|
skirt_gap = 1.5
|
||||||
skirt_line_count = 5
|
skirt_line_count = 5
|
||||||
speed_infill = =speed_print
|
speed_infill = =speed_print
|
||||||
speed_layer_0 = 25
|
speed_layer_0 = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = 40
|
speed_topbottom = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_travel = 200
|
speed_travel = 200
|
||||||
speed_wall_0 = 40
|
speed_wall_0 = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_x = =speed_print
|
speed_wall_x = =speed_print
|
||||||
support_angle = 70
|
support_angle = 70
|
||||||
support_type = buildplate
|
support_type = buildplate
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[general]
|
[general]
|
||||||
version = 4
|
version = 4
|
||||||
name = Draft Quality
|
name = Draft
|
||||||
definition = fdmprinter
|
definition = fdmprinter
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[general]
|
[general]
|
||||||
version = 4
|
version = 4
|
||||||
name = Extra Coarse Quality
|
name = Extra Coarse
|
||||||
definition = fdmprinter
|
definition = fdmprinter
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
|
|
|
@ -43,11 +43,11 @@ skirt_brim_minimal_length = 75
|
||||||
skirt_gap = 1.5
|
skirt_gap = 1.5
|
||||||
skirt_line_count = 5
|
skirt_line_count = 5
|
||||||
speed_infill = =speed_print
|
speed_infill = =speed_print
|
||||||
speed_layer_0 = 25
|
speed_layer_0 = =math.ceil(speed_print * 25 / 30)
|
||||||
speed_print = 30
|
speed_print = 30
|
||||||
speed_topbottom = 40
|
speed_topbottom = =math.ceil(speed_print * 40 / 30)
|
||||||
speed_travel = 200
|
speed_travel = 200
|
||||||
speed_wall_0 = 40
|
speed_wall_0 = =math.ceil(speed_print * 40 / 30)
|
||||||
speed_wall_x = =speed_print
|
speed_wall_x = =speed_print
|
||||||
support_angle = 70
|
support_angle = 70
|
||||||
support_type = buildplate
|
support_type = buildplate
|
||||||
|
|
|
@ -43,11 +43,11 @@ skirt_brim_minimal_length = 75
|
||||||
skirt_gap = 1.5
|
skirt_gap = 1.5
|
||||||
skirt_line_count = 5
|
skirt_line_count = 5
|
||||||
speed_infill = =speed_print
|
speed_infill = =speed_print
|
||||||
speed_layer_0 = 25
|
speed_layer_0 = =math.ceil(speed_print * 25 / 30)
|
||||||
speed_print = 30
|
speed_print = 30
|
||||||
speed_topbottom = 40
|
speed_topbottom = =math.ceil(speed_print * 40 / 30)
|
||||||
speed_travel = 200
|
speed_travel = 200
|
||||||
speed_wall_0 = 40
|
speed_wall_0 = =math.ceil(speed_print * 40 / 30)
|
||||||
speed_wall_x = =speed_print
|
speed_wall_x = =speed_print
|
||||||
support_angle = 70
|
support_angle = 70
|
||||||
support_type = buildplate
|
support_type = buildplate
|
||||||
|
|
|
@ -43,11 +43,11 @@ skirt_brim_minimal_length = 75
|
||||||
skirt_gap = 1.5
|
skirt_gap = 1.5
|
||||||
skirt_line_count = 5
|
skirt_line_count = 5
|
||||||
speed_infill = =speed_print
|
speed_infill = =speed_print
|
||||||
speed_layer_0 = 25
|
speed_layer_0 = =math.ceil(speed_print * 25 / 30)
|
||||||
speed_print = 30
|
speed_print = 30
|
||||||
speed_topbottom = 40
|
speed_topbottom = =math.ceil(speed_print * 40 / 30)
|
||||||
speed_travel = 200
|
speed_travel = 200
|
||||||
speed_wall_0 = 40
|
speed_wall_0 = =math.ceil(speed_print * 40 / 30)
|
||||||
speed_wall_x = =speed_print
|
speed_wall_x = =speed_print
|
||||||
support_angle = 70
|
support_angle = 70
|
||||||
support_type = buildplate
|
support_type = buildplate
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[general]
|
[general]
|
||||||
version = 4
|
version = 4
|
||||||
name = Low Quality
|
name = Normal
|
||||||
definition = fdmprinter
|
definition = fdmprinter
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
|
@ -14,8 +14,8 @@ global_quality = True
|
||||||
infill_sparse_density = 10
|
infill_sparse_density = 10
|
||||||
layer_height = 0.15
|
layer_height = 0.15
|
||||||
cool_min_layer_time = 3
|
cool_min_layer_time = 3
|
||||||
speed_wall_0 = 40
|
speed_wall_0 = =math.ceil(speed_print * 40 / 60)
|
||||||
speed_wall_x = 80
|
speed_wall_x = =math.ceil(speed_print * 80 / 60)
|
||||||
speed_infill = 100
|
speed_infill = =math.ceil(speed_print * 100 / 60)
|
||||||
wall_thickness = 1
|
wall_thickness = 1
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||||
|
|
|
@ -12,5 +12,5 @@ global_quality = True
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.06
|
layer_height = 0.06
|
||||||
speed_topbottom = 15
|
speed_topbottom = =math.ceil(speed_print * 15 / 60)
|
||||||
speed_infill = 80
|
speed_infill = =math.ceil(speed_print * 80 / 60)
|
||||||
|
|
|
@ -43,13 +43,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 25
|
skirt_brim_speed = 25
|
||||||
skirt_line_count = 2
|
skirt_line_count = 2
|
||||||
speed_layer_0 = 14
|
speed_layer_0 = =math.ceil(speed_print * 14 / 40)
|
||||||
speed_print = 40
|
speed_print = 40
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 40)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 40)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 40)
|
||||||
top_thickness = =top_bottom_thickness
|
top_thickness = =top_bottom_thickness
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -43,13 +43,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 25
|
skirt_brim_speed = 25
|
||||||
skirt_line_count = 2
|
skirt_line_count = 2
|
||||||
speed_layer_0 = 14
|
speed_layer_0 = =math.ceil(speed_print * 14 / 40)
|
||||||
speed_print = 40
|
speed_print = 40
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 40)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 40)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 40)
|
||||||
top_thickness = =top_bottom_thickness
|
top_thickness = =top_bottom_thickness
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -43,13 +43,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 25
|
skirt_brim_speed = 25
|
||||||
skirt_line_count = 2
|
skirt_line_count = 2
|
||||||
speed_layer_0 = 14
|
speed_layer_0 = =math.ceil(speed_print * 14 / 40)
|
||||||
speed_print = 40
|
speed_print = 40
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 40)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 40)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 40)
|
||||||
top_thickness = =top_bottom_thickness
|
top_thickness = =top_bottom_thickness
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -43,13 +43,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 25
|
skirt_brim_speed = 25
|
||||||
skirt_line_count = 2
|
skirt_line_count = 2
|
||||||
speed_layer_0 = 14
|
speed_layer_0 = =math.ceil(speed_print * 14 / 40)
|
||||||
speed_print = 40
|
speed_print = 40
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 40)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 40)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 40)
|
||||||
top_thickness = =top_bottom_thickness
|
top_thickness = =top_bottom_thickness
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -41,13 +41,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 20
|
skirt_brim_speed = 20
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 25
|
speed_topbottom = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 45)
|
||||||
top_thickness = 0.8
|
top_thickness = 0.8
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -41,13 +41,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 20
|
skirt_brim_speed = 20
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 25
|
speed_topbottom = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 45)
|
||||||
top_thickness = 0.8
|
top_thickness = 0.8
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -42,13 +42,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 20
|
skirt_brim_speed = 20
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 25
|
speed_topbottom = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 45)
|
||||||
top_thickness = 0.8
|
top_thickness = 0.8
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -42,13 +42,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 20
|
skirt_brim_speed = 20
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 25
|
speed_topbottom = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 45)
|
||||||
top_thickness = 0.8
|
top_thickness = 0.8
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -41,13 +41,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 20
|
skirt_brim_speed = 20
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 25
|
speed_topbottom = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 45)
|
||||||
top_thickness = 0.8
|
top_thickness = 0.8
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -41,13 +41,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 20
|
skirt_brim_speed = 20
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 25
|
speed_topbottom = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 45)
|
||||||
top_thickness = 0.8
|
top_thickness = 0.8
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -43,13 +43,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 20
|
skirt_brim_speed = 20
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 25
|
speed_topbottom = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 45)
|
||||||
top_thickness = 0.8
|
top_thickness = 0.8
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -43,13 +43,13 @@ skin_no_small_gaps_heuristic = False
|
||||||
skirt_brim_minimal_length = 100
|
skirt_brim_minimal_length = 100
|
||||||
skirt_brim_speed = 20
|
skirt_brim_speed = 20
|
||||||
skirt_line_count = 3
|
skirt_line_count = 3
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_slowdown_layers = 1
|
speed_slowdown_layers = 1
|
||||||
speed_topbottom = 25
|
speed_topbottom = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
speed_travel_layer_0 = 60
|
speed_travel_layer_0 = 60
|
||||||
speed_wall = 25
|
speed_wall = =math.ceil(speed_print * 25 / 45)
|
||||||
speed_wall_x = 35
|
speed_wall_x = =math.ceil(speed_print * 35 / 45)
|
||||||
top_thickness = 0.8
|
top_thickness = 0.8
|
||||||
wall_thickness = 0.8
|
wall_thickness = 0.8
|
||||||
|
|
|
@ -15,11 +15,11 @@ layer_height = 0.35
|
||||||
layer_height_0 = 0.3
|
layer_height_0 = 0.3
|
||||||
|
|
||||||
speed_print = 70
|
speed_print = 70
|
||||||
speed_infill = 60
|
speed_infill = =math.ceil(speed_print * 60 / 70)
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||||
speed_wall_0 = 30
|
speed_wall_0 = =math.ceil(speed_print * 30 / 70)
|
||||||
speed_wall_x = 50
|
speed_wall_x = =math.ceil(speed_print * 50 / 70)
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 70)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
|
|
||||||
material_print_temperature = 246
|
material_print_temperature = 246
|
||||||
|
|
|
@ -15,11 +15,11 @@ layer_height = 0.06
|
||||||
layer_height_0 = 0.3
|
layer_height_0 = 0.3
|
||||||
|
|
||||||
speed_print = 40
|
speed_print = 40
|
||||||
speed_infill = 50
|
speed_infill = =math.ceil(speed_print * 50 / 40)
|
||||||
speed_layer_0 = 15
|
speed_layer_0 = =math.ceil(speed_print * 15 / 40)
|
||||||
speed_wall_0 = 20
|
speed_wall_0 = =math.ceil(speed_print * 20 / 40)
|
||||||
speed_wall_x = 40
|
speed_wall_x = =speed_print
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 40)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
|
|
||||||
material_print_temperature = 246
|
material_print_temperature = 246
|
||||||
|
|
|
@ -15,11 +15,11 @@ layer_height = 0.1
|
||||||
layer_height_0 = 0.3
|
layer_height_0 = 0.3
|
||||||
|
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_infill = 60
|
speed_infill = =math.ceil(speed_print * 60 / 50)
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 50)
|
||||||
speed_wall_0 = 25
|
speed_wall_0 = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall_x = 45
|
speed_wall_x = =math.ceil(speed_print * 45 / 50)
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
|
|
||||||
material_print_temperature = 246
|
material_print_temperature = 246
|
||||||
|
|
|
@ -15,11 +15,11 @@ layer_height = 0.2
|
||||||
layer_height_0 = 0.3
|
layer_height_0 = 0.3
|
||||||
|
|
||||||
speed_print = 70
|
speed_print = 70
|
||||||
speed_infill = 60
|
speed_infill = =math.ceil(speed_print * 60 / 70)
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||||
speed_wall_0 = 30
|
speed_wall_0 = =math.ceil(speed_print * 30 / 70)
|
||||||
speed_wall_x = 50
|
speed_wall_x = =math.ceil(speed_print * 50 / 70)
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 70)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
|
|
||||||
material_print_temperature = 246
|
material_print_temperature = 246
|
||||||
|
|
|
@ -15,11 +15,11 @@ layer_height = 0.15
|
||||||
layer_height_0 = 0.3
|
layer_height_0 = 0.3
|
||||||
|
|
||||||
speed_print = 60
|
speed_print = 60
|
||||||
speed_infill = 50
|
speed_infill = =math.ceil(speed_print * 50 / 60)
|
||||||
speed_layer_0 = 15
|
speed_layer_0 = =math.ceil(speed_print * 15 / 60)
|
||||||
speed_wall_0 = 20
|
speed_wall_0 = =math.ceil(speed_print * 20 / 60)
|
||||||
speed_wall_x = 40
|
speed_wall_x = =math.ceil(speed_print * 40 / 60)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 60)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
|
|
||||||
material_print_temperature = 246
|
material_print_temperature = 246
|
||||||
|
|
|
@ -15,11 +15,11 @@ layer_height = 0.06
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
|
|
||||||
speed_print = 40
|
speed_print = 40
|
||||||
speed_infill = 50
|
speed_infill = =math.ceil(speed_print * 50 / 40)
|
||||||
speed_layer_0 = 15
|
speed_layer_0 = =math.ceil(speed_print * 15 / 40)
|
||||||
speed_wall_0 = 20
|
speed_wall_0 = =math.ceil(speed_print * 20 / 40)
|
||||||
speed_wall_x = 40
|
speed_wall_x = =speed_print
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 40)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
|
|
||||||
material_print_temperature = 214
|
material_print_temperature = 214
|
||||||
|
|
|
@ -15,11 +15,11 @@ layer_height = 0.1
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
|
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_infill = 60
|
speed_infill = =math.ceil(speed_print * 60 / 50)
|
||||||
speed_layer_0 = 20
|
speed_layer_0 = =math.ceil(speed_print * 20 / 50)
|
||||||
speed_wall_0 = 25
|
speed_wall_0 = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall_x = 45
|
speed_wall_x = =math.ceil(speed_print * 45 / 50)
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
|
|
||||||
material_print_temperature = 214
|
material_print_temperature = 214
|
||||||
|
|
|
@ -15,11 +15,11 @@ layer_height = 0.15
|
||||||
adhesion_type = skirt
|
adhesion_type = skirt
|
||||||
|
|
||||||
speed_print = 60
|
speed_print = 60
|
||||||
speed_infill = 50
|
speed_infill = =math.ceil(speed_print * 50 / 60)
|
||||||
speed_layer_0 = 15
|
speed_layer_0 = =math.ceil(speed_print * 15 / 60)
|
||||||
speed_wall_0 = 20
|
speed_wall_0 = =math.ceil(speed_print * 20 / 60)
|
||||||
speed_wall_x = 40
|
speed_wall_x = =math.ceil(speed_print * 40 / 60)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 60)
|
||||||
speed_travel = 120
|
speed_travel = 120
|
||||||
|
|
||||||
material_print_temperature = 214
|
material_print_temperature = 214
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -18,6 +18,6 @@ top_bottom_thickness = 0.72
|
||||||
infill_sparse_density = 22
|
infill_sparse_density = 22
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
cool_min_layer_time = 5
|
cool_min_layer_time = 5
|
||||||
cool_min_speed = 10
|
cool_min_speed = 10
|
||||||
|
|
|
@ -14,13 +14,13 @@ brim_width = 4.0
|
||||||
infill_pattern = zigzag
|
infill_pattern = zigzag
|
||||||
layer_height = 0.3
|
layer_height = 0.3
|
||||||
material_diameter = 1.75
|
material_diameter = 1.75
|
||||||
speed_infill = 50
|
speed_infill = =speed_print
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_support = 30
|
speed_support = 30
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
speed_travel = 100
|
speed_travel = 100
|
||||||
speed_wall = 50
|
speed_wall = =speed_print
|
||||||
speed_wall_x = 50
|
speed_wall_x = =speed_print
|
||||||
support_angle = 60
|
support_angle = 60
|
||||||
support_enable = True
|
support_enable = True
|
||||||
support_interface_enable = True
|
support_interface_enable = True
|
||||||
|
|
|
@ -14,13 +14,13 @@ brim_width = 4.0
|
||||||
infill_pattern = zigzag
|
infill_pattern = zigzag
|
||||||
layer_height = 0.1
|
layer_height = 0.1
|
||||||
material_diameter = 1.75
|
material_diameter = 1.75
|
||||||
speed_infill = 50
|
speed_infill = =speed_print
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_support = 30
|
speed_support = 30
|
||||||
speed_topbottom = 15
|
speed_topbottom = =math.ceil(speed_print * 15 / 50)
|
||||||
speed_travel = 100
|
speed_travel = 100
|
||||||
speed_wall = 50
|
speed_wall = =speed_print
|
||||||
speed_wall_x = 50
|
speed_wall_x = =speed_print
|
||||||
support_angle = 60
|
support_angle = 60
|
||||||
support_enable = True
|
support_enable = True
|
||||||
support_interface_enable = True
|
support_interface_enable = True
|
||||||
|
|
|
@ -14,13 +14,13 @@ brim_width = 4.0
|
||||||
infill_pattern = zigzag
|
infill_pattern = zigzag
|
||||||
layer_height = 0.2
|
layer_height = 0.2
|
||||||
material_diameter = 1.75
|
material_diameter = 1.75
|
||||||
speed_infill = 60
|
speed_infill = =math.ceil(speed_print * 60 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_support = 30
|
speed_support = 30
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
speed_travel = 100
|
speed_travel = 100
|
||||||
speed_wall = 50
|
speed_wall = =speed_print
|
||||||
speed_wall_x = 50
|
speed_wall_x = =speed_print
|
||||||
support_angle = 60
|
support_angle = 60
|
||||||
support_enable = True
|
support_enable = True
|
||||||
support_interface_enable = True
|
support_interface_enable = True
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[general]
|
[general]
|
||||||
version = 4
|
version = 4
|
||||||
name = Draft Quality
|
name = Draft
|
||||||
definition = ultimaker2
|
definition = ultimaker2
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[general]
|
[general]
|
||||||
version = 4
|
version = 4
|
||||||
name = Low Quality
|
name = Normal
|
||||||
definition = ultimaker2
|
definition = ultimaker2
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
|
@ -14,8 +14,8 @@ global_quality = True
|
||||||
infill_sparse_density = 10
|
infill_sparse_density = 10
|
||||||
layer_height = 0.15
|
layer_height = 0.15
|
||||||
cool_min_layer_time = 3
|
cool_min_layer_time = 3
|
||||||
speed_wall_0 = 40
|
speed_wall_0 = =math.ceil(speed_print * 40 / 60)
|
||||||
speed_wall_x = 80
|
speed_wall_x = =math.ceil(speed_print * 80 / 60)
|
||||||
speed_infill = 100
|
speed_infill = =math.ceil(speed_print * 100 / 60)
|
||||||
wall_thickness = 1
|
wall_thickness = 1
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||||
|
|
|
@ -12,5 +12,5 @@ global_quality = True
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
layer_height = 0.06
|
layer_height = 0.06
|
||||||
speed_topbottom = 15
|
speed_topbottom = =math.ceil(speed_print * 15 / 60)
|
||||||
speed_infill = 80
|
speed_infill = =math.ceil(speed_print * 80 / 60)
|
||||||
|
|
|
@ -18,8 +18,8 @@ infill_sparse_density = 18
|
||||||
layer_height = 0.15
|
layer_height = 0.15
|
||||||
speed_layer_0 = =round(speed_print * 30 / 60)
|
speed_layer_0 = =round(speed_print * 30 / 60)
|
||||||
speed_print = 60
|
speed_print = 60
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||||
speed_travel = 150
|
speed_travel = 150
|
||||||
speed_wall = 50
|
speed_wall = =math.ceil(speed_print * 50 / 60)
|
||||||
top_bottom_thickness = 0.75
|
top_bottom_thickness = 0.75
|
||||||
wall_thickness = 0.7
|
wall_thickness = 0.7
|
||||||
|
|
|
@ -18,6 +18,6 @@ infill_sparse_density = 22
|
||||||
layer_height = 0.06
|
layer_height = 0.06
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
top_bottom_thickness = 0.72
|
top_bottom_thickness = 0.72
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
|
|
|
@ -18,6 +18,6 @@ infill_sparse_density = 20
|
||||||
layer_height = 0.1
|
layer_height = 0.1
|
||||||
speed_layer_0 = =round(speed_print * 30 / 50)
|
speed_layer_0 = =round(speed_print * 30 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 50)
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
|
|
|
@ -18,8 +18,8 @@ infill_sparse_density = 20
|
||||||
layer_height = 0.15
|
layer_height = 0.15
|
||||||
speed_layer_0 = =round(speed_print * 30 / 55)
|
speed_layer_0 = =round(speed_print * 30 / 55)
|
||||||
speed_print = 55
|
speed_print = 55
|
||||||
speed_topbottom = 20
|
speed_topbottom = =math.ceil(speed_print * 20 / 55)
|
||||||
speed_wall = 40
|
speed_wall = =math.ceil(speed_print * 40 / 55)
|
||||||
speed_wall_0 = 25
|
speed_wall_0 = =math.ceil(speed_print * 25 / 55)
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
wall_thickness = 1.59
|
wall_thickness = 1.59
|
||||||
|
|
|
@ -18,6 +18,6 @@ infill_sparse_density = 20
|
||||||
layer_height = 0.2
|
layer_height = 0.2
|
||||||
speed_layer_0 = =round(speed_print * 30 / 40)
|
speed_layer_0 = =round(speed_print * 30 / 40)
|
||||||
speed_print = 40
|
speed_print = 40
|
||||||
speed_wall_0 = 25
|
speed_wall_0 = =math.ceil(speed_print * 25 / 40)
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
wall_thickness = 2.1
|
wall_thickness = 2.1
|
||||||
|
|
|
@ -20,8 +20,11 @@ infill_sparse_density = 18
|
||||||
layer_height = 0.15
|
layer_height = 0.15
|
||||||
speed_layer_0 = =round(speed_print * 30 / 55)
|
speed_layer_0 = =round(speed_print * 30 / 55)
|
||||||
speed_print = 55
|
speed_print = 55
|
||||||
speed_topbottom = 30
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
speed_travel = 150
|
speed_travel = 150
|
||||||
speed_wall = 40
|
speed_wall = =math.ceil(speed_print * 40 / 55)
|
||||||
top_bottom_thickness = 0.75
|
top_bottom_thickness = 0.75
|
||||||
wall_thickness = 0.7
|
wall_thickness = 0.7
|
||||||
|
speed_wall_0 = =math.ceil(speed_print * 40 / 55)
|
||||||
|
speed_wall_x = =math.ceil(speed_print * 80 / 55)
|
||||||
|
speed_infill = =math.ceil(speed_print * 100 / 55)
|
||||||
|
|
|
@ -20,6 +20,8 @@ infill_sparse_density = 22
|
||||||
layer_height = 0.06
|
layer_height = 0.06
|
||||||
speed_layer_0 = =round(speed_print * 30 / 45)
|
speed_layer_0 = =round(speed_print * 30 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_wall = 30
|
speed_wall = =math.ceil(speed_print * 30 / 45)
|
||||||
top_bottom_thickness = 0.72
|
top_bottom_thickness = 0.72
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
|
speed_topbottom = =math.ceil(speed_print * 15 / 45)
|
||||||
|
speed_infill = =math.ceil(speed_print * 80 / 45)
|
||||||
|
|
|
@ -20,6 +20,6 @@ infill_sparse_density = 20
|
||||||
layer_height = 0.1
|
layer_height = 0.1
|
||||||
speed_layer_0 = =round(speed_print * 30 / 45)
|
speed_layer_0 = =round(speed_print * 30 / 45)
|
||||||
speed_print = 45
|
speed_print = 45
|
||||||
speed_wall = 30
|
speed_wall = =math.ceil(speed_print * 30 / 45)
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
wall_thickness = 1.05
|
wall_thickness = 1.05
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue