mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 14:37:29 -06:00
Merge branch 'master' into feature_intent_container_tree
This commit is contained in:
commit
b18565d9cf
153 changed files with 12828 additions and 252 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -35,7 +35,7 @@ cura.desktop
|
|||
.pydevproject
|
||||
.settings
|
||||
|
||||
#Externally located plug-ins.
|
||||
#Externally located plug-ins commonly installed by our devs.
|
||||
plugins/cura-big-flame-graph
|
||||
plugins/cura-god-mode-plugin
|
||||
plugins/cura-siemensnx-plugin
|
||||
|
@ -52,6 +52,7 @@ plugins/FlatProfileExporter
|
|||
plugins/GodMode
|
||||
plugins/OctoPrintPlugin
|
||||
plugins/ProfileFlattener
|
||||
plugins/SettingsGuide
|
||||
plugins/X3GWriter
|
||||
|
||||
#Build stuff
|
||||
|
|
|
@ -13,6 +13,6 @@ TryExec=@CMAKE_INSTALL_FULL_BINDIR@/cura
|
|||
Icon=cura-icon
|
||||
Terminal=false
|
||||
Type=Application
|
||||
MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;model/x3d+xml;text/x-gcode;
|
||||
MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;text/x-gcode;application/x-amf;application/x-ply;application/x-ctm;model/vnd.collada+xml;model/gltf-binary;model/gltf+json;model/vnd.collada+xml+zip;
|
||||
Categories=Graphics;
|
||||
Keywords=3D;Printing;Slicer;
|
||||
|
|
|
@ -3,15 +3,17 @@
|
|||
|
||||
from PyQt5.QtCore import QObject, QUrl
|
||||
from PyQt5.QtGui import QDesktopServices
|
||||
from typing import List, cast
|
||||
from typing import List, Optional, cast
|
||||
|
||||
from UM.Event import CallFunctionEvent
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from UM.Math.Quaternion import Quaternion
|
||||
from UM.Math.Vector import Vector
|
||||
from UM.Scene.Selection import Selection
|
||||
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
||||
from UM.Operations.GroupedOperation import GroupedOperation
|
||||
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
|
||||
from UM.Operations.RotateOperation import RotateOperation
|
||||
from UM.Operations.TranslateOperation import TranslateOperation
|
||||
|
||||
import cura.CuraApplication
|
||||
|
@ -73,6 +75,39 @@ class CuraActions(QObject):
|
|||
operation.addOperation(center_operation)
|
||||
operation.push()
|
||||
|
||||
# Rotate the selection, so that the face that the mouse-pointer is on, faces the build-plate.
|
||||
@pyqtSlot()
|
||||
def bottomFaceSelection(self) -> None:
|
||||
selected_face = Selection.getSelectedFace()
|
||||
if not selected_face:
|
||||
Logger.log("e", "Bottom face operation shouldn't have been called without a selected face.")
|
||||
return
|
||||
|
||||
original_node, face_id = selected_face
|
||||
meshdata = original_node.getMeshDataTransformed()
|
||||
if not meshdata or face_id < 0 or face_id > Selection.getMaxFaceSelectionId():
|
||||
return
|
||||
|
||||
rotation_point, face_normal = meshdata.getFacePlane(face_id)
|
||||
rotation_point_vector = Vector(rotation_point[0], rotation_point[1], rotation_point[2])
|
||||
face_normal_vector = Vector(face_normal[0], face_normal[1], face_normal[2])
|
||||
rotation_quaternion = Quaternion.rotationTo(face_normal_vector.normalized(), Vector(0.0, -1.0, 0.0))
|
||||
|
||||
operation = GroupedOperation()
|
||||
current_node = None # type: Optional[SceneNode]
|
||||
for node in Selection.getAllSelectedObjects():
|
||||
current_node = node
|
||||
parent_node = current_node.getParent()
|
||||
while parent_node and parent_node.callDecoration("isGroup"):
|
||||
current_node = parent_node
|
||||
parent_node = current_node.getParent()
|
||||
if current_node is None:
|
||||
return
|
||||
|
||||
rotate_operation = RotateOperation(current_node, rotation_quaternion, rotation_point_vector)
|
||||
operation.addOperation(rotate_operation)
|
||||
operation.push()
|
||||
|
||||
## Multiply all objects in the selection
|
||||
#
|
||||
# \param count The number of times to multiply the selection.
|
||||
|
|
|
@ -67,6 +67,7 @@ from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
|||
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator
|
||||
from cura.Scene.CuraSceneController import CuraSceneController
|
||||
from cura.Scene.CuraSceneNode import CuraSceneNode
|
||||
from cura.Scene.GCodeListDecorator import GCodeListDecorator
|
||||
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
|
||||
from cura.Scene import ZOffsetDecorator
|
||||
|
||||
|
@ -1347,7 +1348,13 @@ class CuraApplication(QtApplication):
|
|||
Logger.log("i", "Reloading all loaded mesh data.")
|
||||
nodes = []
|
||||
has_merged_nodes = False
|
||||
gcode_filename = None # type: Optional[str]
|
||||
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
||||
# Objects loaded from Gcode should also be included.
|
||||
gcode_filename = node.callDecoration("getGcodeFileName")
|
||||
if gcode_filename is not None:
|
||||
break
|
||||
|
||||
if not isinstance(node, CuraSceneNode) or not node.getMeshData():
|
||||
if node.getName() == "MergedMesh":
|
||||
has_merged_nodes = True
|
||||
|
@ -1355,6 +1362,11 @@ class CuraApplication(QtApplication):
|
|||
|
||||
nodes.append(node)
|
||||
|
||||
# We can open only one gcode file at the same time. If the current view has a gcode file open, just reopen it
|
||||
# for reloading.
|
||||
if gcode_filename:
|
||||
self._openFile(gcode_filename)
|
||||
|
||||
if not nodes:
|
||||
return
|
||||
|
||||
|
@ -1829,3 +1841,40 @@ class CuraApplication(QtApplication):
|
|||
return main_window.height()
|
||||
else:
|
||||
return 0
|
||||
|
||||
@pyqtSlot()
|
||||
def deleteAll(self, only_selectable: bool = True) -> None:
|
||||
super().deleteAll(only_selectable = only_selectable)
|
||||
|
||||
# Also remove nodes with LayerData
|
||||
self._removeNodesWithLayerData(only_selectable = only_selectable)
|
||||
|
||||
def _removeNodesWithLayerData(self, only_selectable: bool = True) -> None:
|
||||
Logger.log("i", "Clearing scene")
|
||||
nodes = []
|
||||
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
|
||||
if not isinstance(node, SceneNode):
|
||||
continue
|
||||
if not node.isEnabled():
|
||||
continue
|
||||
if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"):
|
||||
continue # Node that doesnt have a mesh and is not a group.
|
||||
if only_selectable and not node.isSelectable():
|
||||
continue # Only remove nodes that are selectable.
|
||||
if not node.callDecoration("isSliceable") and not node.callDecoration("getLayerData") and not node.callDecoration("isGroup"):
|
||||
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
||||
nodes.append(node)
|
||||
if nodes:
|
||||
from UM.Operations.GroupedOperation import GroupedOperation
|
||||
op = GroupedOperation()
|
||||
|
||||
for node in nodes:
|
||||
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
|
||||
op.addOperation(RemoveSceneNodeOperation(node))
|
||||
|
||||
# Reset the print information
|
||||
self.getController().getScene().sceneChanged.emit(node)
|
||||
|
||||
op.push()
|
||||
from UM.Scene.Selection import Selection
|
||||
Selection.clear()
|
||||
|
|
|
@ -35,8 +35,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
|||
def __init__(self, device_id, address: str, properties: Dict[bytes, bytes], connection_type: ConnectionType = ConnectionType.NetworkConnection, parent: QObject = None) -> None:
|
||||
super().__init__(device_id = device_id, connection_type = connection_type, parent = parent)
|
||||
self._manager = None # type: Optional[QNetworkAccessManager]
|
||||
self._last_manager_create_time = None # type: Optional[float]
|
||||
self._recreate_network_manager_time = 30
|
||||
self._timeout_time = 10 # After how many seconds of no response should a timeout occur?
|
||||
|
||||
self._last_response_time = None # type: Optional[float]
|
||||
|
@ -133,12 +131,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
|||
|
||||
self.setConnectionState(ConnectionState.Closed)
|
||||
|
||||
# We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to
|
||||
# sleep.
|
||||
if time_since_last_response > self._recreate_network_manager_time:
|
||||
if self._last_manager_create_time is None or time() - self._last_manager_create_time > self._recreate_network_manager_time:
|
||||
self._createNetworkManager()
|
||||
assert(self._manager is not None)
|
||||
elif self._connection_state == ConnectionState.Closed:
|
||||
# Go out of timeout.
|
||||
if self._connection_state_before_timeout is not None: # sanity check, but it should never be None here
|
||||
|
@ -317,7 +309,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
|||
|
||||
self._manager = QNetworkAccessManager()
|
||||
self._manager.finished.connect(self._handleOnFinished)
|
||||
self._last_manager_create_time = time()
|
||||
self._manager.authenticationRequired.connect(self._onAuthenticationRequired)
|
||||
|
||||
if self._properties.get(b"temporary", b"false") != b"true":
|
||||
|
|
|
@ -1,11 +1,18 @@
|
|||
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
|
||||
from typing import List
|
||||
from typing import List, Optional
|
||||
|
||||
|
||||
class GCodeListDecorator(SceneNodeDecorator):
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self._gcode_list = [] # type: List[str]
|
||||
self._filename = None # type: Optional[str]
|
||||
|
||||
def getGcodeFileName(self) -> Optional[str]:
|
||||
return self._filename
|
||||
|
||||
def setGcodeFileName(self, filename: str) -> None:
|
||||
self._filename = filename
|
||||
|
||||
def getGCodeList(self) -> List[str]:
|
||||
return self._gcode_list
|
||||
|
|
|
@ -242,12 +242,11 @@ class CuraContainerRegistry(ContainerRegistry):
|
|||
|
||||
# And check if the profile_definition matches either one (showing error if not):
|
||||
if profile_definition != expected_machine_definition:
|
||||
Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition)
|
||||
return { "status": "error",
|
||||
"message": catalog.i18nc("@info:status Don't translate the XML tags <filename>!", "The machine defined in profile <filename>{0}</filename> ({1}) doesn't match with your current machine ({2}), could not import it.", file_name, profile_definition, expected_machine_definition)}
|
||||
|
||||
# Fix the global quality profile's definition field in case it's not correct
|
||||
Logger.log("d", "Profile {file_name} is for machine {profile_definition}, but the current active machine is {expected_machine_definition}. Changing profile's definition.".format(file_name = file_name, profile_definition = profile_definition, expected_machine_definition = expected_machine_definition))
|
||||
global_profile.setMetaDataEntry("definition", expected_machine_definition)
|
||||
for extruder_profile in extruder_profiles:
|
||||
extruder_profile.setMetaDataEntry("definition", expected_machine_definition)
|
||||
|
||||
quality_name = global_profile.getName()
|
||||
quality_type = global_profile.getMetaDataEntry("quality_type")
|
||||
|
||||
|
@ -315,9 +314,9 @@ class CuraContainerRegistry(ContainerRegistry):
|
|||
result = self._configureProfile(profile, profile_id, new_name, expected_machine_definition)
|
||||
if result is not None:
|
||||
return {"status": "error", "message": catalog.i18nc(
|
||||
"@info:status Don't translate the XML tags <filename> or <message>!",
|
||||
"@info:status Don't translate the XML tag <filename>!",
|
||||
"Failed to import profile from <filename>{0}</filename>:",
|
||||
file_name) + " <message>" + result + "</message>"}
|
||||
file_name) + " " + result}
|
||||
|
||||
return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from collections import defaultdict
|
||||
|
@ -8,7 +8,7 @@ import uuid
|
|||
|
||||
from PyQt5.QtCore import pyqtProperty, pyqtSlot, pyqtSignal
|
||||
|
||||
from UM.Decorators import override
|
||||
from UM.Decorators import deprecated, override
|
||||
from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase
|
||||
from UM.Settings.ContainerStack import ContainerStack
|
||||
from UM.Settings.SettingInstance import InstanceState
|
||||
|
@ -61,12 +61,13 @@ class GlobalStack(CuraContainerStack):
|
|||
#
|
||||
# \return The extruders registered with this stack.
|
||||
@pyqtProperty("QVariantMap", notify = extrudersChanged)
|
||||
@deprecated("Please use extruderList instead.", "4.4")
|
||||
def extruders(self) -> Dict[str, "ExtruderStack"]:
|
||||
return self._extruders
|
||||
|
||||
@pyqtProperty("QVariantList", notify = extrudersChanged)
|
||||
def extruderList(self) -> List["ExtruderStack"]:
|
||||
result_tuple_list = sorted(list(self.extruders.items()), key=lambda x: int(x[0]))
|
||||
result_tuple_list = sorted(list(self._extruders.items()), key=lambda x: int(x[0]))
|
||||
result_list = [item[1] for item in result_tuple_list]
|
||||
|
||||
machine_extruder_count = self.getProperty("machine_extruder_count", "value")
|
||||
|
|
|
@ -12,6 +12,10 @@ from .CuraContainerStack import CuraContainerStack
|
|||
|
||||
|
||||
class PerObjectContainerStack(CuraContainerStack):
|
||||
def isDirty(self):
|
||||
# This stack should never be auto saved, so always return that there is nothing to save.
|
||||
return False
|
||||
|
||||
@override(CuraContainerStack)
|
||||
def getProperty(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> Any:
|
||||
if context is None:
|
||||
|
|
32
cura_app.py
32
cura_app.py
|
@ -141,5 +141,37 @@ import Arcus #@UnusedImport
|
|||
import Savitar #@UnusedImport
|
||||
from cura.CuraApplication import CuraApplication
|
||||
|
||||
|
||||
# WORKAROUND: CURA-6739
|
||||
# The CTM file loading module in Trimesh requires the OpenCTM library to be dynamically loaded. It uses
|
||||
# ctypes.util.find_library() to find libopenctm.dylib, but this doesn't seem to look in the ".app" application folder
|
||||
# on Mac OS X. Adding the search path to environment variables such as DYLD_LIBRARY_PATH and DYLD_FALLBACK_LIBRARY_PATH
|
||||
# makes it work. The workaround here uses DYLD_FALLBACK_LIBRARY_PATH.
|
||||
if Platform.isOSX() and getattr(sys, "frozen", False):
|
||||
old_env = os.environ.get("DYLD_FALLBACK_LIBRARY_PATH", "")
|
||||
# This is where libopenctm.so is in the .app folder.
|
||||
search_path = os.path.join(CuraApplication.getInstallPrefix(), "MacOS")
|
||||
path_list = old_env.split(":")
|
||||
if search_path not in path_list:
|
||||
path_list.append(search_path)
|
||||
os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = ":".join(path_list)
|
||||
import trimesh.exchange.load
|
||||
os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = old_env
|
||||
|
||||
# WORKAROUND: CURA-6739
|
||||
# Similar CTM file loading fix for Linux, but NOTE THAT this doesn't work directly with Python 3.5.7. There's a fix
|
||||
# for ctypes.util.find_library() in Python 3.6 and 3.7. That fix makes sure that find_library() will check
|
||||
# LD_LIBRARY_PATH. With Python 3.5, that fix needs to be backported to make this workaround work.
|
||||
if Platform.isLinux() and getattr(sys, "frozen", False):
|
||||
old_env = os.environ.get("LD_LIBRARY_PATH", "")
|
||||
# This is where libopenctm.so is in the AppImage.
|
||||
search_path = os.path.join(CuraApplication.getInstallPrefix(), "bin")
|
||||
path_list = old_env.split(":")
|
||||
if search_path not in path_list:
|
||||
path_list.append(search_path)
|
||||
os.environ["LD_LIBRARY_PATH"] = ":".join(path_list)
|
||||
import trimesh.exchange.load
|
||||
os.environ["LD_LIBRARY_PATH"] = old_env
|
||||
|
||||
app = CuraApplication()
|
||||
app.run()
|
||||
|
|
|
@ -34,6 +34,8 @@ from cura.Settings.CuraContainerStack import _ContainerIndexes
|
|||
from cura.CuraApplication import CuraApplication
|
||||
from cura.Utils.Threading import call_on_qt_thread
|
||||
|
||||
from PyQt5.QtCore import QCoreApplication
|
||||
|
||||
from .WorkspaceDialog import WorkspaceDialog
|
||||
|
||||
i18n_catalog = i18nCatalog("cura")
|
||||
|
@ -231,6 +233,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
else:
|
||||
Logger.log("w", "Unknown definition container type %s for %s",
|
||||
definition_container_type, definition_container_file)
|
||||
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||
Job.yieldThread()
|
||||
|
||||
if machine_definition_container_count != 1:
|
||||
|
@ -257,6 +260,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
containers_found_dict["material"] = True
|
||||
if not self._container_registry.isReadOnly(container_id): # Only non readonly materials can be in conflict
|
||||
material_conflict = True
|
||||
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||
Job.yieldThread()
|
||||
|
||||
# Check if any quality_changes instance container is in conflict.
|
||||
|
@ -326,7 +330,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
# Ignore certain instance container types
|
||||
Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type)
|
||||
continue
|
||||
|
||||
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||
Job.yieldThread()
|
||||
|
||||
if self._machine_info.quality_changes_info.global_info is None:
|
||||
|
@ -405,7 +409,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
variant_id = parser["containers"][str(index_map_version[_ContainerIndexes.Variant])]
|
||||
if variant_id not in ("empty", "empty_variant"):
|
||||
self._machine_info.variant_info = instance_container_info_dict[variant_id]
|
||||
|
||||
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||
Job.yieldThread()
|
||||
|
||||
# if the global stack is found, we check if there are conflicts in the extruder stacks
|
||||
|
@ -661,6 +665,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
definition_container = self._container_registry.findDefinitionContainers(id = "fdmprinter")[0] #Fall back to defaults.
|
||||
self._container_registry.addContainer(definition_container)
|
||||
Job.yieldThread()
|
||||
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||
|
||||
Logger.log("d", "Workspace loading is checking materials...")
|
||||
# Get all the material files and check if they exist. If not, add them.
|
||||
|
@ -710,6 +715,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
material_container.setDirty(True)
|
||||
self._container_registry.addContainer(material_container)
|
||||
Job.yieldThread()
|
||||
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||
|
||||
# Handle quality changes if any
|
||||
self._processQualityChanges(global_stack)
|
||||
|
|
|
@ -543,6 +543,15 @@ class CuraEngineBackend(QObject, Backend):
|
|||
if error.getErrorCode() == Arcus.ErrorCode.BindFailedError and self._start_slice_job is not None:
|
||||
self._start_slice_job.setIsCancelled(False)
|
||||
|
||||
# Check if there's any slicable object in the scene.
|
||||
def hasSlicableObject(self) -> bool:
|
||||
has_slicable = False
|
||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||
if node.callDecoration("isSliceable"):
|
||||
has_slicable = True
|
||||
break
|
||||
return has_slicable
|
||||
|
||||
## Remove old layer data (if any)
|
||||
def _clearLayerData(self, build_plate_numbers: Set = None) -> None:
|
||||
# Clear out any old gcode
|
||||
|
@ -561,6 +570,10 @@ class CuraEngineBackend(QObject, Backend):
|
|||
|
||||
## Convenient function: mark everything to slice, emit state and clear layer data
|
||||
def needsSlicing(self) -> None:
|
||||
# CURA-6604: If there's no slicable object, do not (try to) trigger slice, which will clear all the current
|
||||
# gcode. This can break Gcode file loading if it tries to remove it afterwards.
|
||||
if not self.hasSlicableObject():
|
||||
return
|
||||
self.determineAutoSlicing()
|
||||
self.stopSlicing()
|
||||
self.markSliceAll()
|
||||
|
@ -632,7 +645,10 @@ class CuraEngineBackend(QObject, Backend):
|
|||
self.setState(BackendState.Done)
|
||||
self.processingProgress.emit(1.0)
|
||||
|
||||
try:
|
||||
gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] #type: ignore #Because we generate this attribute dynamically.
|
||||
except KeyError: # Can occur if the g-code has been cleared while a slice message is still arriving from the other end.
|
||||
gcode_list = []
|
||||
for index, line in enumerate(gcode_list):
|
||||
replaced = line.replace("{print_time}", str(self._application.getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601)))
|
||||
replaced = replaced.replace("{filament_amount}", str(self._application.getPrintInformation().materialLengths))
|
||||
|
|
|
@ -4,11 +4,11 @@
|
|||
import configparser
|
||||
from typing import List, Optional, Tuple
|
||||
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.Logger import Logger
|
||||
from UM.Settings.ContainerFormatError import ContainerFormatError
|
||||
from UM.Settings.InstanceContainer import InstanceContainer # The new profile to make.
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch
|
||||
from cura.ReaderWriters.ProfileReader import ProfileReader
|
||||
|
||||
import zipfile
|
||||
|
@ -92,6 +92,14 @@ class CuraProfileReader(ProfileReader):
|
|||
except Exception as e:
|
||||
Logger.log("e", "Error while trying to parse profile: %s", str(e))
|
||||
return None
|
||||
|
||||
global_stack = CuraApplication.getInstance().getGlobalContainerStack()
|
||||
if global_stack is None:
|
||||
return None
|
||||
|
||||
active_quality_definition = getMachineDefinitionIDForQualitySearch(global_stack.definition)
|
||||
if profile.getMetaDataEntry("definition") != active_quality_definition:
|
||||
profile.setMetaDataEntry("definition", active_quality_definition)
|
||||
return profile
|
||||
|
||||
## Upgrade a serialized profile to the current profile format.
|
||||
|
|
|
@ -27,6 +27,6 @@ class GCodeGzReader(MeshReader):
|
|||
file_data = file.read()
|
||||
uncompressed_gcode = gzip.decompress(file_data).decode("utf-8")
|
||||
PluginRegistry.getInstance().getPluginObject("GCodeReader").preReadFromStream(uncompressed_gcode)
|
||||
result = PluginRegistry.getInstance().getPluginObject("GCodeReader").readFromStream(uncompressed_gcode)
|
||||
result = PluginRegistry.getInstance().getPluginObject("GCodeReader").readFromStream(uncompressed_gcode, file_name)
|
||||
|
||||
return result
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
import math
|
||||
import re
|
||||
from typing import Dict, List, NamedTuple, Optional, Union
|
||||
from typing import Dict, List, NamedTuple, Optional, Union, Set
|
||||
|
||||
import numpy
|
||||
|
||||
|
@ -38,6 +38,8 @@ class FlavorParser:
|
|||
self._message = None # type: Optional[Message]
|
||||
self._layer_number = 0
|
||||
self._extruder_number = 0
|
||||
# All extruder numbers that have been seen
|
||||
self._extruders_seen = {0} # type: Set[int]
|
||||
self._clearValues()
|
||||
self._scene_node = None
|
||||
# X, Y, Z position, F feedrate and E extruder values are stored
|
||||
|
@ -66,7 +68,7 @@ class FlavorParser:
|
|||
if n < 0:
|
||||
return None
|
||||
n += len(code)
|
||||
pattern = re.compile("[;\s]")
|
||||
pattern = re.compile("[;\\s]")
|
||||
match = pattern.search(line, n)
|
||||
m = match.start() if match is not None else -1
|
||||
try:
|
||||
|
@ -292,7 +294,12 @@ class FlavorParser:
|
|||
extruder.getProperty("machine_nozzle_offset_y", "value")]
|
||||
return result
|
||||
|
||||
def processGCodeStream(self, stream: str) -> Optional[CuraSceneNode]:
|
||||
#
|
||||
# CURA-6643
|
||||
# This function needs the filename so it can be set to the SceneNode. Otherwise, if you load a GCode file and press
|
||||
# F5, that gcode SceneNode will be removed because it doesn't have a file to be reloaded from.
|
||||
#
|
||||
def processGCodeStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]:
|
||||
Logger.log("d", "Preparing to load GCode")
|
||||
self._cancelled = False
|
||||
# We obtain the filament diameter from the selected extruder to calculate line widths
|
||||
|
@ -418,6 +425,7 @@ class FlavorParser:
|
|||
if line.startswith("T"):
|
||||
T = self._getInt(line, "T")
|
||||
if T is not None:
|
||||
self._extruders_seen.add(T)
|
||||
self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0]))
|
||||
current_path.clear()
|
||||
|
||||
|
@ -453,6 +461,7 @@ class FlavorParser:
|
|||
scene_node.addDecorator(decorator)
|
||||
|
||||
gcode_list_decorator = GCodeListDecorator()
|
||||
gcode_list_decorator.setGcodeFileName(filename)
|
||||
gcode_list_decorator.setGCodeList(gcode_list)
|
||||
scene_node.addDecorator(gcode_list_decorator)
|
||||
|
||||
|
@ -467,10 +476,9 @@ class FlavorParser:
|
|||
if self._layer_number == 0:
|
||||
Logger.log("w", "File doesn't contain any valid layers")
|
||||
|
||||
settings = CuraApplication.getInstance().getGlobalContainerStack()
|
||||
if settings is not None and not settings.getProperty("machine_center_is_zero", "value"):
|
||||
machine_width = settings.getProperty("machine_width", "value")
|
||||
machine_depth = settings.getProperty("machine_depth", "value")
|
||||
if not global_stack.getProperty("machine_center_is_zero", "value"):
|
||||
machine_width = global_stack.getProperty("machine_width", "value")
|
||||
machine_depth = global_stack.getProperty("machine_depth", "value")
|
||||
scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2))
|
||||
|
||||
Logger.log("d", "GCode loading finished")
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from typing import Optional, Union, List, TYPE_CHECKING
|
||||
|
||||
from UM.FileHandler.FileReader import FileReader
|
||||
from UM.Mesh.MeshReader import MeshReader
|
||||
from UM.i18n import i18nCatalog
|
||||
|
@ -9,8 +11,14 @@ from UM.Application import Application
|
|||
from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
|
||||
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
from .FlavorParser import FlavorParser
|
||||
from . import MarlinFlavorParser, RepRapFlavorParser
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
from cura.Scene.CuraSceneNode import CuraSceneNode
|
||||
|
||||
|
||||
# Class for loading and parsing G-code files
|
||||
class GCodeReader(MeshReader):
|
||||
|
@ -30,7 +38,7 @@ class GCodeReader(MeshReader):
|
|||
)
|
||||
self._supported_extensions = [".gcode", ".g"]
|
||||
|
||||
self._flavor_reader = None
|
||||
self._flavor_reader = None # type: Optional[FlavorParser]
|
||||
|
||||
Application.getInstance().getPreferences().addPreference("gcodereader/show_caution", True)
|
||||
|
||||
|
@ -54,10 +62,16 @@ class GCodeReader(MeshReader):
|
|||
file_data = file.read()
|
||||
return self.preReadFromStream(file_data, args, kwargs)
|
||||
|
||||
def readFromStream(self, stream):
|
||||
return self._flavor_reader.processGCodeStream(stream)
|
||||
def readFromStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]:
|
||||
if self._flavor_reader is None:
|
||||
return None
|
||||
return self._flavor_reader.processGCodeStream(stream, filename)
|
||||
|
||||
def _read(self, file_name):
|
||||
def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]:
|
||||
with open(file_name, "r", encoding = "utf-8") as file:
|
||||
file_data = file.read()
|
||||
return self.readFromStream(file_data)
|
||||
result = [] # type: List[SceneNode]
|
||||
node = self.readFromStream(file_data, file_name)
|
||||
if node is not None:
|
||||
result.append(node)
|
||||
return result
|
||||
|
|
|
@ -5,6 +5,9 @@ import configparser # An input for some functions we're testing.
|
|||
import os.path # To find the integration test .ini files.
|
||||
import pytest # To register tests with.
|
||||
import unittest.mock # To mock the application, plug-in and container registry out.
|
||||
import os.path
|
||||
import sys
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
|
||||
|
||||
import UM.Application # To mock the application out.
|
||||
import UM.PluginRegistry # To mock the plug-in registry out.
|
||||
|
@ -12,11 +15,13 @@ import UM.Settings.ContainerRegistry # To mock the container registry out.
|
|||
import UM.Settings.InstanceContainer # To intercept the serialised data from the read() function.
|
||||
|
||||
import LegacyProfileReader as LegacyProfileReaderModule # To get the directory of the module.
|
||||
from LegacyProfileReader import LegacyProfileReader # The module we're testing.
|
||||
|
||||
@pytest.fixture
|
||||
def legacy_profile_reader():
|
||||
return LegacyProfileReader()
|
||||
try:
|
||||
return LegacyProfileReaderModule.LegacyProfileReader()
|
||||
except TypeError:
|
||||
return LegacyProfileReaderModule.LegacyProfileReader.LegacyProfileReader()
|
||||
|
||||
test_prepareDefaultsData = [
|
||||
{
|
||||
|
|
|
@ -106,10 +106,17 @@ class PauseAtHeight(Script):
|
|||
"standby_temperature":
|
||||
{
|
||||
"label": "Standby Temperature",
|
||||
"description": "Change the temperature during the pause",
|
||||
"description": "Change the temperature during the pause.",
|
||||
"unit": "°C",
|
||||
"type": "int",
|
||||
"default_value": 0
|
||||
},
|
||||
"display_text":
|
||||
{
|
||||
"label": "Display Text",
|
||||
"description": "Text that should appear on the display while paused. If left empty, there will not be any message.",
|
||||
"type": "str",
|
||||
"default_value": ""
|
||||
}
|
||||
}
|
||||
}"""
|
||||
|
@ -144,6 +151,7 @@ class PauseAtHeight(Script):
|
|||
firmware_retract = Application.getInstance().getGlobalContainerStack().getProperty("machine_firmware_retract", "value")
|
||||
control_temperatures = Application.getInstance().getGlobalContainerStack().getProperty("machine_nozzle_temp_enabled", "value")
|
||||
initial_layer_height = Application.getInstance().getGlobalContainerStack().getProperty("layer_height_0", "value")
|
||||
display_text = self.getSettingValueByKey("display_text")
|
||||
|
||||
is_griffin = False
|
||||
|
||||
|
@ -265,7 +273,7 @@ class PauseAtHeight(Script):
|
|||
|
||||
if not is_griffin:
|
||||
# Retraction
|
||||
prepend_gcode += self.putValue(M = 83) + "\n"
|
||||
prepend_gcode += self.putValue(M = 83) + " ; switch to relative E values for any needed retraction\n"
|
||||
if retraction_amount != 0:
|
||||
if firmware_retract: #Can't set the distance directly to what the user wants. We have to choose ourselves.
|
||||
retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature.
|
||||
|
@ -275,25 +283,28 @@ class PauseAtHeight(Script):
|
|||
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
|
||||
|
||||
# Move the head away
|
||||
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n"
|
||||
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + " ; move up a millimeter to get out of the way\n"
|
||||
|
||||
# This line should be ok
|
||||
prepend_gcode += self.putValue(G = 1, X = park_x, Y = park_y, F = 9000) + "\n"
|
||||
|
||||
if current_z < 15:
|
||||
prepend_gcode += self.putValue(G = 1, Z = 15, F = 300) + "\n"
|
||||
prepend_gcode += self.putValue(G = 1, Z = 15, F = 300) + " ; too close to bed--move to at least 15mm\n"
|
||||
|
||||
if control_temperatures:
|
||||
# Set extruder standby temperature
|
||||
prepend_gcode += self.putValue(M = 104, S = standby_temperature) + "; standby temperature\n"
|
||||
prepend_gcode += self.putValue(M = 104, S = standby_temperature) + " ; standby temperature\n"
|
||||
|
||||
if display_text:
|
||||
prepend_gcode += "M117 " + display_text + "\n"
|
||||
|
||||
# Wait till the user continues printing
|
||||
prepend_gcode += self.putValue(M = 0) + ";Do the actual pause\n"
|
||||
prepend_gcode += self.putValue(M = 0) + " ; Do the actual pause\n"
|
||||
|
||||
if not is_griffin:
|
||||
if control_temperatures:
|
||||
# Set extruder resume temperature
|
||||
prepend_gcode += self.putValue(M = 109, S = int(target_temperature.get(current_t, 0))) + "; resume temperature\n"
|
||||
prepend_gcode += self.putValue(M = 109, S = int(target_temperature.get(current_t, 0))) + " ; resume temperature\n"
|
||||
|
||||
# Push the filament back,
|
||||
if retraction_amount != 0:
|
||||
|
@ -309,8 +320,10 @@ class PauseAtHeight(Script):
|
|||
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
|
||||
|
||||
# Move the head back
|
||||
if current_z < 15:
|
||||
prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n"
|
||||
prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n"
|
||||
prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + " ; move back down to resume height\n"
|
||||
if retraction_amount != 0:
|
||||
if firmware_retract: #Can't set the distance directly to what the user wants. We have to choose ourselves.
|
||||
retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature.
|
||||
|
@ -319,7 +332,7 @@ class PauseAtHeight(Script):
|
|||
else:
|
||||
prepend_gcode += self.putValue(G = 1, E = retraction_amount, F = retraction_speed * 60) + "\n"
|
||||
prepend_gcode += self.putValue(G = 1, F = 9000) + "\n"
|
||||
prepend_gcode += self.putValue(M = 82) + "\n"
|
||||
prepend_gcode += self.putValue(M = 82) + " ; switch back to absolute E values\n"
|
||||
|
||||
# reset extrude value to pre pause value
|
||||
prepend_gcode += self.putValue(G = 92, E = current_e) + "\n"
|
||||
|
|
75
plugins/PostProcessingPlugin/scripts/RetractContinue.py
Normal file
75
plugins/PostProcessingPlugin/scripts/RetractContinue.py
Normal file
|
@ -0,0 +1,75 @@
|
|||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
import math
|
||||
|
||||
from ..Script import Script
|
||||
|
||||
## Continues retracting during all travel moves.
|
||||
class RetractContinue(Script):
|
||||
def getSettingDataString(self):
|
||||
return """{
|
||||
"name": "Retract Continue",
|
||||
"key": "RetractContinue",
|
||||
"metadata": {},
|
||||
"version": 2,
|
||||
"settings":
|
||||
{
|
||||
"extra_retraction_speed":
|
||||
{
|
||||
"label": "Extra Retraction Ratio",
|
||||
"description": "How much does it retract during the travel move, by ratio of the travel length.",
|
||||
"type": "float",
|
||||
"default_value": 0.05
|
||||
}
|
||||
}
|
||||
}"""
|
||||
|
||||
def execute(self, data):
|
||||
current_e = 0
|
||||
current_x = 0
|
||||
current_y = 0
|
||||
extra_retraction_speed = self.getSettingValueByKey("extra_retraction_speed")
|
||||
|
||||
for layer_number, layer in enumerate(data):
|
||||
lines = layer.split("\n")
|
||||
for line_number, line in enumerate(lines):
|
||||
if self.getValue(line, "G") in {0, 1}: # Track X,Y location.
|
||||
current_x = self.getValue(line, "X", current_x)
|
||||
current_y = self.getValue(line, "Y", current_y)
|
||||
if self.getValue(line, "G") == 1:
|
||||
if self.getValue(line, "E"):
|
||||
new_e = self.getValue(line, "E")
|
||||
if new_e >= current_e: # Not a retraction.
|
||||
continue
|
||||
# A retracted travel move may consist of multiple commands, due to combing.
|
||||
# This continues retracting over all of these moves and only unretracts at the end.
|
||||
delta_line = 1
|
||||
dx = current_x # Track the difference in X for this move only to compute the length of the travel.
|
||||
dy = current_y
|
||||
while line_number + delta_line < len(lines) and self.getValue(lines[line_number + delta_line], "G") != 1:
|
||||
travel_move = lines[line_number + delta_line]
|
||||
if self.getValue(travel_move, "G") != 0:
|
||||
delta_line += 1
|
||||
continue
|
||||
travel_x = self.getValue(travel_move, "X", dx)
|
||||
travel_y = self.getValue(travel_move, "Y", dy)
|
||||
f = self.getValue(travel_move, "F", "no f")
|
||||
length = math.sqrt((travel_x - dx) * (travel_x - dx) + (travel_y - dy) * (travel_y - dy)) # Length of the travel move.
|
||||
new_e -= length * extra_retraction_speed # New retraction is by ratio of this travel move.
|
||||
if f == "no f":
|
||||
new_travel_move = "G1 X{travel_x} Y{travel_y} E{new_e}".format(travel_x = travel_x, travel_y = travel_y, new_e = new_e)
|
||||
else:
|
||||
new_travel_move = "G1 F{f} X{travel_x} Y{travel_y} E{new_e}".format(f = f, travel_x = travel_x, travel_y = travel_y, new_e = new_e)
|
||||
lines[line_number + delta_line] = new_travel_move
|
||||
|
||||
delta_line += 1
|
||||
dx = travel_x
|
||||
dy = travel_y
|
||||
|
||||
current_e = new_e
|
||||
|
||||
new_layer = "\n".join(lines)
|
||||
data[layer_number] = new_layer
|
||||
|
||||
return data
|
|
@ -77,10 +77,10 @@ class TimeLapse(Script):
|
|||
gcode_to_append = ";TimeLapse Begin\n"
|
||||
|
||||
if park_print_head:
|
||||
gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n"
|
||||
gcode_to_append += self.putValue(M = 400) + ";Wait for moves to finish\n"
|
||||
gcode_to_append += trigger_command + ";Snap Photo\n"
|
||||
gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n"
|
||||
gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + " ;Park print head\n"
|
||||
gcode_to_append += self.putValue(M = 400) + " ;Wait for moves to finish\n"
|
||||
gcode_to_append += trigger_command + " ;Snap Photo\n"
|
||||
gcode_to_append += self.putValue(G = 4, P = pause_length) + " ;Wait for camera\n"
|
||||
gcode_to_append += ";TimeLapse End\n"
|
||||
for layer in data:
|
||||
# Check that a layer is being printed
|
||||
|
|
|
@ -386,7 +386,7 @@ class SimulationView(CuraView):
|
|||
self._max_thickness = max(float(p.lineThicknesses.max()), self._max_thickness)
|
||||
try:
|
||||
self._min_thickness = min(float(p.lineThicknesses[numpy.nonzero(p.lineThicknesses)].min()), self._min_thickness)
|
||||
except:
|
||||
except ValueError:
|
||||
# Sometimes, when importing a GCode the line thicknesses are zero and so the minimum (avoiding
|
||||
# the zero) can't be calculated
|
||||
Logger.log("i", "Min thickness can't be calculated because all the values are zero")
|
||||
|
@ -468,6 +468,9 @@ class SimulationView(CuraView):
|
|||
Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferencesChanged)
|
||||
self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged)
|
||||
|
||||
self.calculateMaxLayers()
|
||||
self.calculateMaxPathsOnLayer(self._current_layer_num)
|
||||
|
||||
# FIX: on Max OS X, somehow QOpenGLContext.currentContext() can become None during View switching.
|
||||
# This can happen when you do the following steps:
|
||||
# 1. Start Cura
|
||||
|
|
|
@ -139,6 +139,10 @@ class SolidView(View):
|
|||
shade_factor * int(material_color[5:7], 16) / 255,
|
||||
1.0
|
||||
]
|
||||
|
||||
# Color the currently selected face-id.
|
||||
face = Selection.getSelectedFace()
|
||||
uniforms["selected_face"] = (Selection.getMaxFaceSelectionId() + 1) if not face or node != face[0] else face[1]
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
|
161
plugins/TrimeshReader/TrimeshReader.py
Normal file
161
plugins/TrimeshReader/TrimeshReader.py
Normal file
|
@ -0,0 +1,161 @@
|
|||
# Copyright (c) 2019 Ultimaker B.V., fieldOfView
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
# The _toMeshData function is taken from the AMFReader class which was built by fieldOfView.
|
||||
|
||||
from typing import Any, List, Union, TYPE_CHECKING
|
||||
import numpy # To create the mesh data.
|
||||
import os.path # To create the mesh name for the resulting mesh.
|
||||
import trimesh # To load the files into a Trimesh.
|
||||
|
||||
from UM.Mesh.MeshData import MeshData, calculateNormalsFromIndexedVertices # To construct meshes from the Trimesh data.
|
||||
from UM.Mesh.MeshReader import MeshReader # The plug-in type we're extending.
|
||||
from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType # To add file types that we can open.
|
||||
from UM.Scene.GroupDecorator import GroupDecorator # Added to the parent node if we load multiple nodes at once.
|
||||
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator # Added to the resulting scene node.
|
||||
from cura.Scene.ConvexHullDecorator import ConvexHullDecorator # Added to group nodes if we load multiple nodes at once.
|
||||
from cura.Scene.CuraSceneNode import CuraSceneNode # To create a node in the scene after reading the file.
|
||||
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator # Added to the resulting scene node.
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
|
||||
## Class that leverages Trimesh to import files.
|
||||
class TrimeshReader(MeshReader):
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
|
||||
self._supported_extensions = [".ctm", ".dae", ".gltf", ".glb", ".ply", ".zae"]
|
||||
MimeTypeDatabase.addMimeType(
|
||||
MimeType(
|
||||
name = "application/x-ctm",
|
||||
comment = "Open Compressed Triangle Mesh",
|
||||
suffixes = ["ctm"]
|
||||
)
|
||||
)
|
||||
MimeTypeDatabase.addMimeType(
|
||||
MimeType(
|
||||
name = "model/vnd.collada+xml",
|
||||
comment = "COLLADA Digital Asset Exchange",
|
||||
suffixes = ["dae"]
|
||||
)
|
||||
)
|
||||
MimeTypeDatabase.addMimeType(
|
||||
MimeType(
|
||||
name = "model/gltf-binary",
|
||||
comment = "glTF Binary",
|
||||
suffixes = ["glb"]
|
||||
)
|
||||
)
|
||||
MimeTypeDatabase.addMimeType(
|
||||
MimeType(
|
||||
name = "model/gltf+json",
|
||||
comment = "glTF Embedded JSON",
|
||||
suffixes = ["gltf"]
|
||||
)
|
||||
)
|
||||
# Trimesh seems to have a bug when reading .off files.
|
||||
#MimeTypeDatabase.addMimeType(
|
||||
# MimeType(
|
||||
# name = "application/x-off",
|
||||
# comment = "Geomview Object File Format",
|
||||
# suffixes = ["off"]
|
||||
# )
|
||||
#)
|
||||
MimeTypeDatabase.addMimeType(
|
||||
MimeType(
|
||||
name = "application/x-ply", # Wikipedia lists the MIME type as "text/plain" but that won't do as it's not unique to PLY files.
|
||||
comment = "Stanford Triangle Format",
|
||||
suffixes = ["ply"]
|
||||
)
|
||||
)
|
||||
MimeTypeDatabase.addMimeType(
|
||||
MimeType(
|
||||
name = "model/vnd.collada+xml+zip",
|
||||
comment = "Compressed COLLADA Digital Asset Exchange",
|
||||
suffixes = ["zae"]
|
||||
)
|
||||
)
|
||||
|
||||
## Reads a file using Trimesh.
|
||||
# \param file_name The file path. This is assumed to be one of the file
|
||||
# types that Trimesh can read. It will not be checked again.
|
||||
# \return A scene node that contains the file's contents.
|
||||
def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]:
|
||||
# CURA-6739
|
||||
# GLTF files are essentially JSON files. If you directly give a file name to trimesh.load(), it will
|
||||
# try to figure out the format, but for GLTF, it loads it as a binary file with flags "rb", and the json.load()
|
||||
# doesn't like it. For some reason, this seems to happen with 3.5.7, but not 3.7.1. Below is a workaround to
|
||||
# pass a file object that has been opened with "r" instead "rb" to load a GLTF file.
|
||||
if file_name.lower().endswith(".gltf"):
|
||||
mesh_or_scene = trimesh.load(open(file_name, "r", encoding = "utf-8"), file_type = "gltf")
|
||||
else:
|
||||
mesh_or_scene = trimesh.load(file_name)
|
||||
|
||||
meshes = [] # type: List[Union[trimesh.Trimesh, trimesh.Scene, Any]]
|
||||
if isinstance(mesh_or_scene, trimesh.Trimesh):
|
||||
meshes = [mesh_or_scene]
|
||||
elif isinstance(mesh_or_scene, trimesh.Scene):
|
||||
meshes = [mesh for mesh in mesh_or_scene.geometry.values()]
|
||||
|
||||
active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
|
||||
nodes = [] # type: List[SceneNode]
|
||||
for mesh in meshes:
|
||||
if not isinstance(mesh, trimesh.Trimesh): # Trimesh can also receive point clouds, 2D paths, 3D paths or metadata. Skip those.
|
||||
continue
|
||||
mesh.merge_vertices()
|
||||
mesh.remove_unreferenced_vertices()
|
||||
mesh.fix_normals()
|
||||
mesh_data = self._toMeshData(mesh)
|
||||
|
||||
file_base_name = os.path.basename(file_name)
|
||||
new_node = CuraSceneNode()
|
||||
new_node.setMeshData(mesh_data)
|
||||
new_node.setSelectable(True)
|
||||
new_node.setName(file_base_name if len(meshes) == 1 else "{file_base_name} {counter}".format(file_base_name = file_base_name, counter = str(len(nodes) + 1)))
|
||||
new_node.addDecorator(BuildPlateDecorator(active_build_plate))
|
||||
new_node.addDecorator(SliceableObjectDecorator())
|
||||
nodes.append(new_node)
|
||||
|
||||
if len(nodes) == 1:
|
||||
return nodes[0]
|
||||
# Add all nodes to a group so they stay together.
|
||||
group_node = CuraSceneNode()
|
||||
group_node.addDecorator(GroupDecorator())
|
||||
group_node.addDecorator(ConvexHullDecorator())
|
||||
group_node.addDecorator(BuildPlateDecorator(active_build_plate))
|
||||
for node in nodes:
|
||||
node.setParent(group_node)
|
||||
return group_node
|
||||
|
||||
## Converts a Trimesh to Uranium's MeshData.
|
||||
# \param tri_node A Trimesh containing the contents of a file that was
|
||||
# just read.
|
||||
# \return Mesh data from the Trimesh in a way that Uranium can understand
|
||||
# it.
|
||||
def _toMeshData(self, tri_node: trimesh.base.Trimesh) -> MeshData:
|
||||
tri_faces = tri_node.faces
|
||||
tri_vertices = tri_node.vertices
|
||||
|
||||
indices = []
|
||||
vertices = []
|
||||
|
||||
index_count = 0
|
||||
face_count = 0
|
||||
for tri_face in tri_faces:
|
||||
face = []
|
||||
for tri_index in tri_face:
|
||||
vertices.append(tri_vertices[tri_index])
|
||||
face.append(index_count)
|
||||
index_count += 1
|
||||
indices.append(face)
|
||||
face_count += 1
|
||||
|
||||
vertices = numpy.asarray(vertices, dtype = numpy.float32)
|
||||
indices = numpy.asarray(indices, dtype = numpy.int32)
|
||||
normals = calculateNormalsFromIndexedVertices(vertices, indices, face_count)
|
||||
|
||||
mesh_data = MeshData(vertices = vertices, indices = indices, normals = normals)
|
||||
return mesh_data
|
46
plugins/TrimeshReader/__init__.py
Normal file
46
plugins/TrimeshReader/__init__.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Copyright (c) 2019 Ultimaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from . import TrimeshReader
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
i18n_catalog = i18nCatalog("uranium")
|
||||
|
||||
|
||||
def getMetaData():
|
||||
return {
|
||||
"mesh_reader": [
|
||||
{
|
||||
"extension": "ctm",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "Open Compressed Triangle Mesh")
|
||||
},
|
||||
{
|
||||
"extension": "dae",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "COLLADA Digital Asset Exchange")
|
||||
},
|
||||
{
|
||||
"extension": "glb",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "glTF Binary")
|
||||
},
|
||||
{
|
||||
"extension": "gltf",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "glTF Embedded JSON")
|
||||
},
|
||||
# Trimesh seems to have a bug when reading OFF files.
|
||||
#{
|
||||
# "extension": "off",
|
||||
# "description": i18n_catalog.i18nc("@item:inlistbox", "Geomview Object File Format")
|
||||
#},
|
||||
{
|
||||
"extension": "ply",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "Stanford Triangle Format")
|
||||
},
|
||||
{
|
||||
"extension": "zae",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "Compressed COLLADA Digital Asset Exchange")
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
def register(app):
|
||||
return {"mesh_reader": TrimeshReader.TrimeshReader()}
|
7
plugins/TrimeshReader/plugin.json
Normal file
7
plugins/TrimeshReader/plugin.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"name": "Trimesh Reader",
|
||||
"author": "Ultimaker B.V.",
|
||||
"version": "1.0.0",
|
||||
"description": "Provides support for reading model files.",
|
||||
"api": "6.0.0"
|
||||
}
|
|
@ -39,4 +39,4 @@ class UFPReader(MeshReader):
|
|||
# Open the GCodeReader to parse the data
|
||||
gcode_reader = PluginRegistry.getInstance().getPluginObject("GCodeReader") # type: ignore
|
||||
gcode_reader.preReadFromStream(gcode_stream) # type: ignore
|
||||
return gcode_reader.readFromStream(gcode_stream) # type: ignore
|
||||
return gcode_reader.readFromStream(gcode_stream, file_name) # type: ignore
|
||||
|
|
|
@ -171,7 +171,11 @@ class CloudOutputDeviceManager:
|
|||
machine.setName(device.name)
|
||||
machine.setMetaDataEntry(self.META_CLUSTER_ID, device.key)
|
||||
machine.setMetaDataEntry("group_name", device.name)
|
||||
|
||||
device.connect()
|
||||
machine.addConfiguredConnectionType(device.connectionType.value)
|
||||
CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(device)
|
||||
|
||||
if not device.isConnected():
|
||||
device.connect()
|
||||
|
||||
output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
|
||||
if device.key not in output_device_manager.getOutputDeviceIds():
|
||||
output_device_manager.addOutputDevice(device)
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
from typing import Optional
|
||||
|
||||
from .ClusterPrintCoreConfiguration import ClusterPrintCoreConfiguration
|
||||
|
||||
|
||||
|
@ -10,8 +12,11 @@ class ClusterPrinterMaterialStationSlot(ClusterPrintCoreConfiguration):
|
|||
# \param slot_index: The index of the slot in the material station (ranging 0 to 5).
|
||||
# \param compatible: Whether the configuration is compatible with the print core.
|
||||
# \param material_remaining: How much material is remaining on the spool (between 0 and 1, or -1 for missing data).
|
||||
def __init__(self, slot_index: int, compatible: bool, material_remaining: float, **kwargs):
|
||||
# \param material_empty: Whether the material spool is too empty to be used.
|
||||
def __init__(self, slot_index: int, compatible: bool, material_remaining: float,
|
||||
material_empty: Optional[bool] = False, **kwargs):
|
||||
self.slot_index = slot_index
|
||||
self.compatible = compatible
|
||||
self.material_remaining = material_remaining
|
||||
self.material_empty = material_empty
|
||||
super().__init__(**kwargs)
|
||||
|
|
|
@ -66,7 +66,11 @@ class ClusterPrinterStatus(BaseModel):
|
|||
## Creates a new output model.
|
||||
# \param controller - The controller of the model.
|
||||
def createOutputModel(self, controller: PrinterOutputController) -> PrinterOutputModel:
|
||||
model = PrinterOutputModel(controller, len(self.configuration), firmware_version = self.firmware_version)
|
||||
# FIXME
|
||||
# Note that we're using '2' here as extruder count. We have hardcoded this for now to prevent issues where the
|
||||
# amount of extruders coming back from the API is actually lower (which it can be if a printer was just added
|
||||
# to a cluster). This should be fixed in the future, probably also on the cluster API side.
|
||||
model = PrinterOutputModel(controller, 2, firmware_version = self.firmware_version)
|
||||
self.updateOutputModel(model)
|
||||
return model
|
||||
|
||||
|
@ -80,6 +84,11 @@ class ClusterPrinterStatus(BaseModel):
|
|||
model.updateBuildplate(self.build_plate.type if self.build_plate else "glass")
|
||||
model.setCameraUrl(QUrl("http://{}:8080/?action=stream".format(self.ip_address)))
|
||||
|
||||
if not model.printerConfiguration:
|
||||
# Prevent accessing printer configuration when not available.
|
||||
# This sometimes happens when a printer was just added to a group and Cura is connected to that group.
|
||||
return
|
||||
|
||||
# Set the possible configurations based on whether a Material Station is present or not.
|
||||
if self.material_station and self.material_station.material_slots:
|
||||
self._updateAvailableConfigurations(model)
|
||||
|
@ -115,7 +124,7 @@ class ClusterPrinterStatus(BaseModel):
|
|||
# We filter out any slot that is not supported by the extruder index, print core type or if the material is empty.
|
||||
@staticmethod
|
||||
def _isSupportedConfiguration(slot: ClusterPrinterMaterialStationSlot, extruder_index: int) -> bool:
|
||||
return slot.extruder_index == extruder_index and slot.compatible
|
||||
return slot.extruder_index == extruder_index and slot.compatible and not slot.material_empty
|
||||
|
||||
## Create an empty material slot with a fake empty material.
|
||||
@staticmethod
|
||||
|
|
|
@ -135,7 +135,7 @@ class ClusterApiClient:
|
|||
result = model_class(**response) # type: ClusterApiClientModel
|
||||
on_finished_item = cast(Callable[[ClusterApiClientModel], Any], on_finished)
|
||||
on_finished_item(result)
|
||||
except JSONDecodeError:
|
||||
except (JSONDecodeError, TypeError):
|
||||
Logger.log("e", "Could not parse response from network: %s", str(response))
|
||||
|
||||
## Creates a callback function so that it includes the parsing of the response into the correct model.
|
||||
|
|
|
@ -122,9 +122,6 @@ class LocalClusterOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
|||
|
||||
self.writeStarted.emit(self)
|
||||
|
||||
# Make sure the printer is aware of all new materials as the new print job might contain one.
|
||||
self.sendMaterialProfiles()
|
||||
|
||||
# Export the scene to the correct file type.
|
||||
job = ExportFileJob(file_handler=file_handler, nodes=nodes, firmware_version=self.firmwareVersion)
|
||||
job.finished.connect(self._onPrintJobCreated)
|
||||
|
|
|
@ -135,10 +135,13 @@ class LocalClusterOutputDeviceManager:
|
|||
ultimaker_machines = container_registry.findContainersMetadata(type="machine", manufacturer="Ultimaker B.V.")
|
||||
found_machine_type_identifiers = {} # type: Dict[str, str]
|
||||
for machine in ultimaker_machines:
|
||||
machine_bom_number = machine.get("firmware_update_info", {}).get("id", None)
|
||||
machine_type = machine.get("id", None)
|
||||
if machine_bom_number and machine_type:
|
||||
found_machine_type_identifiers[str(machine_bom_number)] = machine_type
|
||||
machine_bom_numbers = machine.get("bom_numbers", [])
|
||||
if machine_type and machine_bom_numbers:
|
||||
for bom_number in machine_bom_numbers:
|
||||
# This produces a n:1 mapping of bom numbers to machine types
|
||||
# allowing the S5R1 and S5R2 hardware to use a single S5 definition.
|
||||
found_machine_type_identifiers[str(bom_number)] = machine_type
|
||||
return found_machine_type_identifiers
|
||||
|
||||
## Add a new device.
|
||||
|
@ -236,7 +239,11 @@ class LocalClusterOutputDeviceManager:
|
|||
machine.setName(device.name)
|
||||
machine.setMetaDataEntry(self.META_NETWORK_KEY, device.key)
|
||||
machine.setMetaDataEntry("group_name", device.name)
|
||||
|
||||
device.connect()
|
||||
machine.addConfiguredConnectionType(device.connectionType.value)
|
||||
CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(device)
|
||||
|
||||
if not device.isConnected():
|
||||
device.connect()
|
||||
|
||||
output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
|
||||
if device.key not in output_device_manager.getOutputDeviceIds():
|
||||
output_device_manager.addOutputDevice(device)
|
||||
|
|
|
@ -105,7 +105,6 @@ class SendMaterialJob(Job):
|
|||
parts.append(self.device.createFormPart("name=\"signature_file\"; filename=\"{file_name}\""
|
||||
.format(file_name = signature_file_name), f.read()))
|
||||
|
||||
Logger.log("d", "Syncing material %s with cluster.", material_id)
|
||||
# FIXME: move form posting to API client
|
||||
self.device.postFormWithParts(target = "/cluster-api/v1/materials/", parts = parts,
|
||||
on_finished = self._sendingFinished)
|
||||
|
@ -118,7 +117,6 @@ class SendMaterialJob(Job):
|
|||
body = reply.readAll().data().decode('utf8')
|
||||
if "not added" in body:
|
||||
# For some reason the cluster returns a 200 sometimes even when syncing failed.
|
||||
Logger.log("w", "Error while syncing material: %s", body)
|
||||
return
|
||||
# Inform the user that materials have been synced. This message only shows itself when not already visible.
|
||||
# Because of the guards above it is not shown when syncing failed (which is not always an actual problem).
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
# Copyright (c) 2017 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
import os.path
|
||||
import sys
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
|
||||
|
||||
import configparser #To check whether the appropriate exceptions are raised.
|
||||
import pytest #To register tests with.
|
||||
|
|
|
@ -3,7 +3,9 @@
|
|||
|
||||
import configparser #To check whether the appropriate exceptions are raised.
|
||||
import pytest #To register tests with.
|
||||
|
||||
import os.path
|
||||
import sys
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
|
||||
import VersionUpgrade26to27 #The module we're testing.
|
||||
|
||||
## Creates an instance of the upgrader to test with.
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
# Copyright (c) 2017 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import os.path
|
||||
import sys
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
|
||||
import configparser #To parse the resulting config files.
|
||||
import pytest #To register tests with.
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import os.path
|
||||
import sys
|
||||
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
|
||||
import configparser #To parse the resulting config files.
|
||||
import pytest #To register tests with.
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ import io
|
|||
import json #To parse the product-to-id mapping file.
|
||||
import os.path #To find the product-to-id mapping.
|
||||
import sys
|
||||
from typing import Any, Dict, List, Optional, Tuple, cast, Set
|
||||
from typing import Any, Dict, List, Optional, Tuple, cast, Set, Union
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from UM.Resources import Resources
|
||||
|
@ -20,7 +20,10 @@ from cura.CuraApplication import CuraApplication
|
|||
from cura.Machines.ContainerTree import ContainerTree
|
||||
from cura.Machines.VariantType import VariantType
|
||||
|
||||
from .XmlMaterialValidator import XmlMaterialValidator
|
||||
try:
|
||||
from .XmlMaterialValidator import XmlMaterialValidator
|
||||
except (ImportError, SystemError):
|
||||
import XmlMaterialValidator # type: ignore # This fixes the tests not being able to import.
|
||||
|
||||
|
||||
## Handles serializing and deserializing material containers from an XML file
|
||||
|
@ -41,11 +44,11 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
#
|
||||
# \param xml_version: The version number found in an XML file.
|
||||
# \return The corresponding setting_version.
|
||||
@classmethod
|
||||
def xmlVersionToSettingVersion(cls, xml_version: str) -> int:
|
||||
@staticmethod
|
||||
def xmlVersionToSettingVersion(xml_version: str) -> int:
|
||||
if xml_version == "1.3":
|
||||
return CuraApplication.SettingVersion
|
||||
return 0 #Older than 1.3.
|
||||
return 0 # Older than 1.3.
|
||||
|
||||
def getInheritedFiles(self):
|
||||
return self._inherited_files
|
||||
|
@ -407,7 +410,8 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
self._combineElement(self._expandMachinesXML(result), self._expandMachinesXML(second))
|
||||
return result
|
||||
|
||||
def _createKey(self, element):
|
||||
@staticmethod
|
||||
def _createKey(element):
|
||||
key = element.tag.split("}")[-1]
|
||||
if "key" in element.attrib:
|
||||
key += " key:" + element.attrib["key"]
|
||||
|
@ -423,15 +427,15 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
|
||||
# Recursively merges XML elements. Updates either the text or children if another element is found in first.
|
||||
# If it does not exist, copies it from second.
|
||||
def _combineElement(self, first, second):
|
||||
@staticmethod
|
||||
def _combineElement(first, second):
|
||||
# Create a mapping from tag name to element.
|
||||
|
||||
mapping = {}
|
||||
for element in first:
|
||||
key = self._createKey(element)
|
||||
key = XmlMaterialProfile._createKey(element)
|
||||
mapping[key] = element
|
||||
for element in second:
|
||||
key = self._createKey(element)
|
||||
key = XmlMaterialProfile._createKey(element)
|
||||
if len(element): # Check if element has children.
|
||||
try:
|
||||
if "setting" in element.tag and not "settings" in element.tag:
|
||||
|
@ -441,7 +445,7 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
for child in element:
|
||||
mapping[key].append(child)
|
||||
else:
|
||||
self._combineElement(mapping[key], element) # Multiple elements, handle those.
|
||||
XmlMaterialProfile._combineElement(mapping[key], element) # Multiple elements, handle those.
|
||||
except KeyError:
|
||||
mapping[key] = element
|
||||
first.append(element)
|
||||
|
@ -742,9 +746,9 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
ContainerRegistry.getInstance().addContainer(container_to_add)
|
||||
|
||||
@classmethod
|
||||
def _getSettingsDictForNode(cls, node) -> Tuple[dict, dict]:
|
||||
node_mapped_settings_dict = dict()
|
||||
node_unmapped_settings_dict = dict()
|
||||
def _getSettingsDictForNode(cls, node) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
||||
node_mapped_settings_dict = dict() # type: Dict[str, Any]
|
||||
node_unmapped_settings_dict = dict() # type: Dict[str, Any]
|
||||
|
||||
# Fetch settings in the "um" namespace
|
||||
um_settings = node.iterfind("./um:setting", cls.__namespaces)
|
||||
|
@ -1039,8 +1043,8 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
builder.data(data)
|
||||
builder.end(tag_name)
|
||||
|
||||
@classmethod
|
||||
def _profile_name(cls, material_name, color_name):
|
||||
@staticmethod
|
||||
def _profile_name(material_name, color_name):
|
||||
if material_name is None:
|
||||
return "Unknown Material"
|
||||
if color_name != "Generic":
|
||||
|
@ -1048,8 +1052,8 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
else:
|
||||
return material_name
|
||||
|
||||
@classmethod
|
||||
def getPossibleDefinitionIDsFromName(cls, name):
|
||||
@staticmethod
|
||||
def getPossibleDefinitionIDsFromName(name):
|
||||
name_parts = name.lower().split(" ")
|
||||
merged_name_parts = []
|
||||
for part in name_parts:
|
||||
|
@ -1087,8 +1091,8 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
return product_to_id_map
|
||||
|
||||
## Parse the value of the "material compatible" property.
|
||||
@classmethod
|
||||
def _parseCompatibleValue(cls, value: str):
|
||||
@staticmethod
|
||||
def _parseCompatibleValue(value: str):
|
||||
return value in {"yes", "unknown"}
|
||||
|
||||
## Small string representation for debugging.
|
||||
|
@ -1117,7 +1121,7 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
"break position": "material_break_retracted_position",
|
||||
"break speed": "material_break_speed",
|
||||
"break temperature": "material_break_temperature"
|
||||
}
|
||||
} # type: Dict[str, str]
|
||||
__unmapped_settings = [
|
||||
"hardware compatible",
|
||||
"hardware recommended"
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
"Ultimaker 2+": "ultimaker2_plus",
|
||||
"Ultimaker 3": "ultimaker3",
|
||||
"Ultimaker 3 Extended": "ultimaker3_extended",
|
||||
"Ultimaker S3": "ultimaker_s3",
|
||||
"Ultimaker S5": "ultimaker_s5",
|
||||
"Ultimaker Original": "ultimaker_original",
|
||||
"Ultimaker Original+": "ultimaker_original_plus",
|
||||
|
|
79
plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
Normal file
79
plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
Normal file
|
@ -0,0 +1,79 @@
|
|||
from unittest.mock import patch, MagicMock
|
||||
import sys
|
||||
import os
|
||||
|
||||
# Prevents error: "PyCapsule_GetPointer called with incorrect name" with conflicting SIP configurations between Arcus and PyQt: Import Arcus and Savitar first!
|
||||
import Savitar # Dont remove this line
|
||||
import Arcus # No really. Don't. It needs to be there!
|
||||
from UM.Qt.QtApplication import QtApplication # QtApplication import is required, even though it isn't used.
|
||||
|
||||
import pytest
|
||||
import XmlMaterialProfile
|
||||
|
||||
def createXmlMaterialProfile(material_id):
|
||||
try:
|
||||
return XmlMaterialProfile.XmlMaterialProfile.XmlMaterialProfile(material_id)
|
||||
except AttributeError:
|
||||
return XmlMaterialProfile.XmlMaterialProfile(material_id)
|
||||
|
||||
|
||||
def test_setName():
|
||||
material_1 = createXmlMaterialProfile("herpderp")
|
||||
material_2 = createXmlMaterialProfile("OMGZOMG")
|
||||
|
||||
material_1.getMetaData()["base_file"] = "herpderp"
|
||||
material_2.getMetaData()["base_file"] = "herpderp"
|
||||
|
||||
container_registry = MagicMock()
|
||||
container_registry.isReadOnly = MagicMock(return_value = False)
|
||||
container_registry.findInstanceContainers = MagicMock(return_value = [material_1, material_2])
|
||||
|
||||
with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
|
||||
material_1.setName("beep!")
|
||||
|
||||
assert material_1.getName() == "beep!"
|
||||
assert material_2.getName() == "beep!"
|
||||
|
||||
|
||||
def test_setDirty():
|
||||
material_1 = createXmlMaterialProfile("herpderp")
|
||||
material_2 = createXmlMaterialProfile("OMGZOMG")
|
||||
|
||||
material_1.getMetaData()["base_file"] = "herpderp"
|
||||
material_2.getMetaData()["base_file"] = "herpderp"
|
||||
|
||||
container_registry = MagicMock()
|
||||
container_registry.isReadOnly = MagicMock(return_value=False)
|
||||
container_registry.findContainers = MagicMock(return_value=[material_1, material_2])
|
||||
|
||||
# Sanity check. Since we did a hacky thing to set the metadata, the container should not be dirty.
|
||||
# But this test assumes that it works like that, so we need to validate that.
|
||||
assert not material_1.isDirty()
|
||||
assert not material_2.isDirty()
|
||||
|
||||
with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
|
||||
material_2.setDirty(True)
|
||||
|
||||
assert material_1.isDirty()
|
||||
assert material_2.isDirty()
|
||||
|
||||
# Setting the base material dirty does not set it's child as dirty.
|
||||
with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
|
||||
material_1.setDirty(False)
|
||||
|
||||
assert not material_1.isDirty()
|
||||
assert material_2.isDirty()
|
||||
|
||||
|
||||
def test_serializeNonBaseMaterial():
|
||||
material_1 = createXmlMaterialProfile("herpderp")
|
||||
material_1.getMetaData()["base_file"] = "omgzomg"
|
||||
|
||||
container_registry = MagicMock()
|
||||
container_registry.isReadOnly = MagicMock(return_value=False)
|
||||
container_registry.findContainers = MagicMock(return_value=[material_1])
|
||||
|
||||
with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
|
||||
with pytest.raises(NotImplementedError):
|
||||
# This material is not a base material, so it can't be serialized!
|
||||
material_1.serialize()
|
|
@ -2,146 +2,6 @@
|
|||
"name": "Creawsome Base Printer",
|
||||
"version": 2,
|
||||
"inherits": "fdmprinter",
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Creawsome Base Printer" },
|
||||
"machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n"},
|
||||
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z\n" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 500 },
|
||||
"machine_max_feedrate_y": { "value": 500 },
|
||||
"machine_max_feedrate_z": { "value": 10 },
|
||||
"machine_max_feedrate_e": { "value": 50 },
|
||||
|
||||
"machine_max_acceleration_x": { "value": 500 },
|
||||
"machine_max_acceleration_y": { "value": 500 },
|
||||
"machine_max_acceleration_z": { "value": 100 },
|
||||
"machine_max_acceleration_e": { "value": 5000 },
|
||||
"machine_acceleration": { "value": 500 },
|
||||
|
||||
"machine_max_jerk_xy": { "value": 10 },
|
||||
"machine_max_jerk_z": { "value": 0.4 },
|
||||
"machine_max_jerk_e": { "value": 5 },
|
||||
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
|
||||
"acceleration_print": { "value": 500 },
|
||||
"acceleration_travel": { "value": 500 },
|
||||
"acceleration_travel_layer_0": { "value": "acceleration_travel" },
|
||||
"acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
|
||||
|
||||
"jerk_print": { "value": 8 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
|
||||
"acceleration_enabled": { "value": false },
|
||||
"jerk_enabled": { "value": false },
|
||||
|
||||
"speed_print": { "value": 50.0 } ,
|
||||
"speed_infill": { "value": "speed_print" },
|
||||
"speed_wall": { "value": "speed_print / 2" },
|
||||
"speed_wall_0": { "value": "speed_wall" },
|
||||
"speed_wall_x": { "value": "speed_wall" },
|
||||
"speed_topbottom": { "value": "speed_print / 2" },
|
||||
"speed_roofing": { "value": "speed_topbottom" },
|
||||
"speed_travel": { "value": "150.0 if speed_print < 60 else 250.0 if speed_print > 100 else speed_print * 2.5" },
|
||||
"speed_layer_0": { "value": 20.0 },
|
||||
"speed_print_layer_0": { "value": "speed_layer_0" },
|
||||
"speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" },
|
||||
"speed_prime_tower": { "value": "speed_topbottom" },
|
||||
"speed_support": { "value": "speed_wall_0" },
|
||||
"speed_support_interface": { "value": "speed_topbottom" },
|
||||
"speed_z_hop": {"value": 5},
|
||||
|
||||
"skirt_brim_speed": { "value": "speed_layer_0" },
|
||||
|
||||
"line_width": { "value": "machine_nozzle_size * 1.1"},
|
||||
|
||||
"material_initial_print_temperature": { "value": "material_print_temperature"},
|
||||
"material_final_print_temperature": { "value": "material_print_temperature"},
|
||||
"material_flow": { "value": 100},
|
||||
|
||||
"z_seam_type": { "value": "'back'"},
|
||||
"z_seam_corner": { "value": "'z_seam_corner_none'"},
|
||||
|
||||
"infill_sparse_density": { "value": "20"},
|
||||
"infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'"},
|
||||
"infill_before_walls": { "value": false },
|
||||
"infill_overlap": { "value": 30.0 },
|
||||
"skin_overlap": { "value": 10.0 },
|
||||
"infill_wipe_dist": { "value": 0.0 },
|
||||
"wall_0_wipe_dist": { "value": 0.0 },
|
||||
|
||||
"fill_perimeter_gaps": { "value": "'everywhere'" },
|
||||
"fill_outline_gaps": { "value": false },
|
||||
"filter_out_tiny_gaps": { "value": false },
|
||||
|
||||
"retraction_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
|
||||
"maximum_value": 200
|
||||
},
|
||||
"retraction_retract_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
|
||||
"maximum_value": 200
|
||||
},
|
||||
"retraction_prime_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
|
||||
"maximum_value": 200
|
||||
},
|
||||
|
||||
"retraction_hop_enabled": { "value": "support_enable" },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"retraction_combing": { "value": "'off' if retraction_hop_enabled else 'infill'"},
|
||||
"retraction_combing_max_distance": { "value": 30},
|
||||
"travel_avoid_other_parts": { "value": true },
|
||||
"travel_avoid_supports": { "value": true },
|
||||
"travel_retract_before_outer_wall": { "value": true },
|
||||
|
||||
"retraction_enable": { "value": true },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_min_travel": { "value": 1.5 },
|
||||
|
||||
"cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" },
|
||||
"cool_fan_enabled": { "value": true },
|
||||
"cool_min_layer_time": { "value": 10 },
|
||||
|
||||
"adhesion_type": { "value": "'skirt'" },
|
||||
"brim_replaces_support": { "value": false },
|
||||
"skirt_gap": { "value": 10.0 },
|
||||
"skirt_line_count": { "value": 4 },
|
||||
|
||||
"adaptive_layer_height_variation": { "value": 0.04},
|
||||
"adaptive_layer_height_variation_step": { "value": 0.04 },
|
||||
|
||||
"meshfix_maximum_resolution": { "value": "0.05" },
|
||||
"meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" },
|
||||
|
||||
"support_type": { "value": "'buildplate'"},
|
||||
"support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" },
|
||||
"support_pattern": { "value": "'zigzag'" },
|
||||
"support_infill_rate": { "value": "0 if support_tree_enable else 20" },
|
||||
"support_use_towers": { "value": false },
|
||||
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
|
||||
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
|
||||
"support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height*2" },
|
||||
"support_xy_overrides_z": { "value": "'xy_overrides_z'" },
|
||||
"support_wall_count": { "value": 1},
|
||||
"support_brim_enable": { "value": true},
|
||||
"support_brim_width": { "value": 4},
|
||||
|
||||
"support_interface_enable": { "value": true },
|
||||
"support_interface_height": { "value": "layer_height * 4" },
|
||||
"support_interface_density": { "value": 33.333 },
|
||||
"support_interface_pattern": { "value": "'grid'" },
|
||||
"support_interface_skip_height": { "value": 0.2},
|
||||
"minimum_support_area": { "value": 10},
|
||||
"minimum_interface_area": { "value": 10},
|
||||
"top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3"},
|
||||
"wall_thickness": {"value": "line_width * 2"}
|
||||
|
||||
},
|
||||
"metadata": {
|
||||
"visible": false,
|
||||
"author": "trouch.com",
|
||||
|
@ -261,5 +121,147 @@
|
|||
"zyyx_pro_flex",
|
||||
"zyyx_pro_pla"
|
||||
]
|
||||
},
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Creawsome Base Printer" },
|
||||
"machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n" },
|
||||
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z\n" },
|
||||
|
||||
"machine_max_feedrate_x": { "value": 500 },
|
||||
"machine_max_feedrate_y": { "value": 500 },
|
||||
"machine_max_feedrate_z": { "value": 10 },
|
||||
"machine_max_feedrate_e": { "value": 50 },
|
||||
|
||||
"machine_max_acceleration_x": { "value": 500 },
|
||||
"machine_max_acceleration_y": { "value": 500 },
|
||||
"machine_max_acceleration_z": { "value": 100 },
|
||||
"machine_max_acceleration_e": { "value": 5000 },
|
||||
"machine_acceleration": { "value": 500 },
|
||||
|
||||
"machine_max_jerk_xy": { "value": 10 },
|
||||
"machine_max_jerk_z": { "value": 0.4 },
|
||||
"machine_max_jerk_e": { "value": 5 },
|
||||
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
|
||||
"acceleration_print": { "value": 500 },
|
||||
"acceleration_travel": { "value": 500 },
|
||||
"acceleration_travel_layer_0": { "value": "acceleration_travel" },
|
||||
"acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
|
||||
|
||||
"jerk_print": { "value": 8 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
|
||||
"acceleration_enabled": { "value": false },
|
||||
"jerk_enabled": { "value": false },
|
||||
|
||||
"speed_print": { "value": 50.0 } ,
|
||||
"speed_infill": { "value": "speed_print" },
|
||||
"speed_wall": { "value": "speed_print / 2" },
|
||||
"speed_wall_0": { "value": "speed_wall" },
|
||||
"speed_wall_x": { "value": "speed_wall" },
|
||||
"speed_topbottom": { "value": "speed_print / 2" },
|
||||
"speed_roofing": { "value": "speed_topbottom" },
|
||||
"speed_travel": { "value": "150.0 if speed_print < 60 else 250.0 if speed_print > 100 else speed_print * 2.5" },
|
||||
"speed_layer_0": { "value": 20.0 },
|
||||
"speed_print_layer_0": { "value": "speed_layer_0" },
|
||||
"speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" },
|
||||
"speed_prime_tower": { "value": "speed_topbottom" },
|
||||
"speed_support": { "value": "speed_wall_0" },
|
||||
"speed_support_interface": { "value": "speed_topbottom" },
|
||||
"speed_z_hop": { "value": 5 },
|
||||
|
||||
"skirt_brim_speed": { "value": "speed_layer_0" },
|
||||
|
||||
"line_width": { "value": "machine_nozzle_size" },
|
||||
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
|
||||
"material_initial_print_temperature": { "value": "material_print_temperature" },
|
||||
"material_final_print_temperature": { "value": "material_print_temperature" },
|
||||
"material_flow": { "value": 100 },
|
||||
"travel_compensate_overlapping_walls_0_enabled": { "value": "False" },
|
||||
|
||||
"z_seam_type": { "value": "'back'" },
|
||||
"z_seam_corner": { "value": "'z_seam_corner_weighted'" },
|
||||
|
||||
"infill_sparse_density": { "value": "20" },
|
||||
"infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" },
|
||||
"infill_before_walls": { "value": false },
|
||||
"infill_overlap": { "value": 30.0 },
|
||||
"skin_overlap": { "value": 10.0 },
|
||||
"infill_wipe_dist": { "value": 0.0 },
|
||||
"wall_0_wipe_dist": { "value": 0.0 },
|
||||
|
||||
"fill_perimeter_gaps": { "value": "'everywhere'" },
|
||||
"fill_outline_gaps": { "value": false },
|
||||
"filter_out_tiny_gaps": { "value": false },
|
||||
|
||||
"retraction_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
|
||||
"maximum_value": 200
|
||||
},
|
||||
"retraction_retract_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
|
||||
"maximum_value": 200
|
||||
},
|
||||
"retraction_prime_speed": {
|
||||
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
|
||||
"maximum_value": 200
|
||||
},
|
||||
|
||||
"retraction_hop_enabled": { "value": "False" },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"retraction_combing": { "value": "'off' if retraction_hop_enabled else 'noskin'" },
|
||||
"retraction_combing_max_distance": { "value": 30 },
|
||||
"travel_avoid_other_parts": { "value": true },
|
||||
"travel_avoid_supports": { "value": true },
|
||||
"travel_retract_before_outer_wall": { "value": true },
|
||||
|
||||
"retraction_enable": { "value": true },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_min_travel": { "value": 1.5 },
|
||||
|
||||
"cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" },
|
||||
"cool_fan_enabled": { "value": true },
|
||||
"cool_min_layer_time": { "value": 10 },
|
||||
|
||||
"adhesion_type": { "value": "'skirt'" },
|
||||
"brim_replaces_support": { "value": false },
|
||||
"skirt_gap": { "value": 10.0 },
|
||||
"skirt_line_count": { "value": 3 },
|
||||
|
||||
"adaptive_layer_height_variation": { "value": 0.04 },
|
||||
"adaptive_layer_height_variation_step": { "value": 0.04 },
|
||||
|
||||
"meshfix_maximum_resolution": { "value": "0.05" },
|
||||
"meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" },
|
||||
|
||||
"support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" },
|
||||
"support_pattern": { "value": "'zigzag'" },
|
||||
"support_infill_rate": { "value": "0 if support_tree_enable else 20" },
|
||||
"support_use_towers": { "value": false },
|
||||
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
|
||||
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
|
||||
"support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height*2" },
|
||||
"support_xy_overrides_z": { "value": "'xy_overrides_z'" },
|
||||
"support_wall_count": { "value": 1 },
|
||||
"support_brim_enable": { "value": true },
|
||||
"support_brim_width": { "value": 4 },
|
||||
|
||||
"support_interface_enable": { "value": true },
|
||||
"support_interface_height": { "value": "layer_height * 4" },
|
||||
"support_interface_density": { "value": 33.333 },
|
||||
"support_interface_pattern": { "value": "'grid'" },
|
||||
"support_interface_skip_height": { "value": 0.2 },
|
||||
"minimum_support_area": { "value": 5 },
|
||||
"minimum_interface_area": { "value": 10 },
|
||||
"top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" },
|
||||
"wall_thickness": {"value": "line_width * 2" }
|
||||
|
||||
}
|
||||
}
|
|
@ -13,10 +13,10 @@
|
|||
"machine_depth": { "default_value": 220 },
|
||||
"machine_height": { "default_value": 250 },
|
||||
"machine_head_polygon": { "default_value": [
|
||||
[-26, 34],
|
||||
[-26, -32],
|
||||
[22, -32],
|
||||
[22, 34]
|
||||
[-1, 1],
|
||||
[-1, -1],
|
||||
[1, -1],
|
||||
[1, 1]
|
||||
]
|
||||
},
|
||||
"machine_head_with_fans_polygon": { "default_value": [
|
||||
|
|
|
@ -2511,6 +2511,7 @@
|
|||
"minimum_value": "5",
|
||||
"minimum_value_warning": "50",
|
||||
"maximum_value_warning": "150",
|
||||
"enabled": "support_enable",
|
||||
"limit_to_extruder": "support_infill_extruder_nr",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
|
@ -3891,7 +3892,7 @@
|
|||
"value": "retraction_hop",
|
||||
"minimum_value_warning": "0",
|
||||
"maximum_value_warning": "10",
|
||||
"enabled": "retraction_enable and retraction_hop_after_extruder_switch",
|
||||
"enabled": "retraction_enable and retraction_hop_after_extruder_switch and extruders_enabled_count > 1",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
"metadata": {
|
||||
"visible": true,
|
||||
"author": "Calvindog717",
|
||||
"manufacturer": "PrintrBot",
|
||||
"manufacturer": "Printrbot",
|
||||
"platform": "printrbot_simple_metal_platform.stl",
|
||||
"platform_offset": [0, -3.45, 0],
|
||||
"file_formats": "text/x-gcode",
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
"metadata": {
|
||||
"visible": true,
|
||||
"author": "samsector",
|
||||
"manufacturer": "PrintrBot",
|
||||
"manufacturer": "Printrbot",
|
||||
"platform": "printrbot_simple_metal_upgrade.stl",
|
||||
"platform_offset": [0, -0.3, 0],
|
||||
"file_formats": "text/x-gcode",
|
||||
|
|
|
@ -33,7 +33,10 @@
|
|||
"https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version"
|
||||
],
|
||||
"update_url": "https://ultimaker.com/firmware"
|
||||
}
|
||||
},
|
||||
"bom_numbers": [
|
||||
9066
|
||||
]
|
||||
},
|
||||
|
||||
|
||||
|
|
|
@ -30,7 +30,10 @@
|
|||
"https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version"
|
||||
],
|
||||
"update_url": "https://ultimaker.com/firmware"
|
||||
}
|
||||
},
|
||||
"bom_numbers": [
|
||||
9511
|
||||
]
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
|
|
168
resources/definitions/ultimaker_s3.def.json
Normal file
168
resources/definitions/ultimaker_s3.def.json
Normal file
|
@ -0,0 +1,168 @@
|
|||
{
|
||||
"id": "ultimaker_s3",
|
||||
"version": 2,
|
||||
"name": "Ultimaker S3",
|
||||
"inherits": "ultimaker",
|
||||
"metadata": {
|
||||
"author": "Ultimaker",
|
||||
"manufacturer": "Ultimaker B.V.",
|
||||
"category": "Ultimaker",
|
||||
"visible": true,
|
||||
"file_formats": "application/x-ufp;text/x-gcode",
|
||||
"platform": "ultimaker_s3_platform.obj",
|
||||
"platform_texture": "UltimakerS3backplate.png",
|
||||
"platform_offset": [0, 0, 0],
|
||||
"has_machine_quality": true,
|
||||
"has_materials": true,
|
||||
"has_variant_buildplates": false,
|
||||
"has_variants": true,
|
||||
"exclude_materials": [ "generic_hips", "generic_petg", "structur3d_dap100silicone" ],
|
||||
"preferred_variant_name": "AA 0.4",
|
||||
"preferred_quality_type": "normal",
|
||||
"variants_name": "Print core",
|
||||
"nozzle_offsetting_for_disallowed_areas": false,
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "ultimaker_s3_extruder_left",
|
||||
"1": "ultimaker_s3_extruder_right"
|
||||
},
|
||||
"first_start_actions": [ "DiscoverUM3Action" ],
|
||||
"supported_actions": [ "DiscoverUM3Action" ],
|
||||
"supports_usb_connection": false,
|
||||
"weight": -1,
|
||||
"firmware_update_info": {
|
||||
"id": 213482,
|
||||
"check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"],
|
||||
"update_url": "https://ultimaker.com/firmware"
|
||||
},
|
||||
"bom_numbers": [
|
||||
213482
|
||||
]
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"machine_name": { "default_value": "Ultimaker S3" },
|
||||
"machine_width": { "default_value": 230 },
|
||||
"machine_depth": { "default_value": 190 },
|
||||
"machine_height": { "default_value": 200 },
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 1.4 },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 0.8 },
|
||||
"machine_head_with_fans_polygon":
|
||||
{
|
||||
"default_value":
|
||||
[
|
||||
[ -41.4, -45.8 ],
|
||||
[ -41.4, 36.0 ],
|
||||
[ 63.3, 36.0 ],
|
||||
[ 63.3, -45.8 ]
|
||||
]
|
||||
},
|
||||
"machine_gcode_flavor": { "default_value": "Griffin" },
|
||||
"machine_max_feedrate_x": { "default_value": 300 },
|
||||
"machine_max_feedrate_y": { "default_value": 300 },
|
||||
"machine_max_feedrate_z": { "default_value": 40 },
|
||||
"machine_acceleration": { "default_value": 3000 },
|
||||
"gantry_height": { "value": "60" },
|
||||
"machine_extruder_count": { "default_value": 2 },
|
||||
"extruder_prime_pos_abs": { "default_value": true },
|
||||
"machine_start_gcode": { "default_value": "" },
|
||||
"machine_end_gcode": { "default_value": "" },
|
||||
"prime_tower_position_x": { "default_value": 345 },
|
||||
"prime_tower_position_y": { "default_value": 222.5 },
|
||||
"prime_blob_enable": { "enabled": true, "default_value": false },
|
||||
|
||||
"speed_travel":
|
||||
{
|
||||
"maximum_value": "150",
|
||||
"value": "150"
|
||||
},
|
||||
|
||||
"acceleration_enabled": { "value": "True" },
|
||||
"acceleration_layer_0": { "value": "acceleration_topbottom" },
|
||||
"acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
|
||||
"acceleration_print": { "value": "4000" },
|
||||
"acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
|
||||
"acceleration_support_interface": { "value": "acceleration_topbottom" },
|
||||
"acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" },
|
||||
"acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" },
|
||||
"acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" },
|
||||
"brim_width": { "value": "3" },
|
||||
"cool_fan_full_at_height": { "value": "layer_height_0 + 4 * layer_height" },
|
||||
"cool_fan_speed": { "value": "50" },
|
||||
"cool_fan_speed_max": { "value": "100" },
|
||||
"cool_min_speed": { "value": "5" },
|
||||
"infill_line_width": { "value": "round(line_width * 0.5 / 0.35, 2)" },
|
||||
"infill_overlap": { "value": "0" },
|
||||
"infill_pattern": { "value": "'triangles'" },
|
||||
"infill_wipe_dist": { "value": "0" },
|
||||
"jerk_enabled": { "value": "True" },
|
||||
"jerk_layer_0": { "value": "jerk_topbottom" },
|
||||
"jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" },
|
||||
"jerk_print": { "value": "25" },
|
||||
"jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" },
|
||||
"jerk_support_interface": { "value": "jerk_topbottom" },
|
||||
"jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" },
|
||||
"jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" },
|
||||
"jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" },
|
||||
"layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" },
|
||||
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
|
||||
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
|
||||
"line_width": { "value": "machine_nozzle_size * 0.875" },
|
||||
"machine_min_cool_heat_time_window": { "value": "15" },
|
||||
"default_material_print_temperature": { "value": "200" },
|
||||
"material_standby_temperature": { "value": "100" },
|
||||
"multiple_mesh_overlap": { "value": "0" },
|
||||
"prime_tower_enable": { "value": "True" },
|
||||
"raft_airgap": { "value": "0" },
|
||||
"raft_base_speed": { "value": "20" },
|
||||
"raft_base_thickness": { "value": "0.3" },
|
||||
"raft_interface_line_spacing": { "value": "0.5" },
|
||||
"raft_interface_line_width": { "value": "0.5" },
|
||||
"raft_interface_speed": { "value": "20" },
|
||||
"raft_interface_thickness": { "value": "0.2" },
|
||||
"raft_jerk": { "value": "jerk_layer_0" },
|
||||
"raft_margin": { "value": "10" },
|
||||
"raft_speed": { "value": "25" },
|
||||
"raft_surface_layers": { "value": "1" },
|
||||
"retraction_amount": { "value": "6.5" },
|
||||
"retraction_count_max": { "value": "10" },
|
||||
"retraction_extrusion_window": { "value": "1" },
|
||||
"retraction_hop": { "value": "2" },
|
||||
"retraction_hop_enabled": { "value": "extruders_enabled_count > 1" },
|
||||
"retraction_hop_only_when_collides": { "value": "True" },
|
||||
"retraction_min_travel": { "value": "5" },
|
||||
"retraction_prime_speed": { "value": "15" },
|
||||
"skin_overlap": { "value": "10" },
|
||||
"speed_equalize_flow_enabled": { "value": "True" },
|
||||
"speed_layer_0": { "value": "20" },
|
||||
"speed_prime_tower": { "value": "speed_topbottom" },
|
||||
"speed_print": { "value": "35" },
|
||||
"speed_support": { "value": "speed_wall_0" },
|
||||
"speed_support_interface": { "value": "speed_topbottom" },
|
||||
"speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" },
|
||||
"speed_wall": { "value": "math.ceil(speed_print * 30 / 35)" },
|
||||
"speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 30)" },
|
||||
"speed_wall_x": { "value": "speed_wall" },
|
||||
"support_angle": { "value": "45" },
|
||||
"support_pattern": { "value": "'triangles'" },
|
||||
"support_use_towers": { "value": "False" },
|
||||
"support_xy_distance": { "value": "wall_line_width_0 * 2.5" },
|
||||
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
|
||||
"support_z_distance": { "value": "0" },
|
||||
"switch_extruder_prime_speed": { "value": "15" },
|
||||
"switch_extruder_retraction_amount": { "value": "8" },
|
||||
"top_bottom_thickness": { "value": "1" },
|
||||
"travel_avoid_supports": { "value": "True" },
|
||||
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
|
||||
"wall_0_inset": { "value": "0" },
|
||||
"wall_line_width_x": { "value": "round(line_width * 0.3 / 0.35, 2)" },
|
||||
"wall_thickness": { "value": "1" },
|
||||
"meshfix_maximum_resolution": { "value": "(speed_wall_0 + speed_wall_x) / 60" },
|
||||
"meshfix_maximum_deviation": { "value": "layer_height / 2" },
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"retraction_combing": { "default_value": "all" },
|
||||
"initial_layer_line_width_factor": { "value": "120" },
|
||||
"zig_zaggify_infill": { "value": "gradual_infill_steps == 0" }
|
||||
}
|
||||
}
|
|
@ -35,7 +35,10 @@
|
|||
"id": 9051,
|
||||
"check_urls": ["https://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version"],
|
||||
"update_url": "https://ultimaker.com/firmware"
|
||||
}
|
||||
},
|
||||
"bom_numbers": [
|
||||
9051, 214475
|
||||
]
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
|
|
30
resources/extruders/ultimaker_s3_extruder_left.def.json
Normal file
30
resources/extruders/ultimaker_s3_extruder_left.def.json
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"id": "ultimaker_s3_extruder_left",
|
||||
"version": 2,
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "ultimaker_s3",
|
||||
"position": "0"
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"extruder_nr": {
|
||||
"default_value": 0,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_nozzle_offset_x": { "default_value": 0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 },
|
||||
|
||||
"machine_extruder_start_pos_abs": { "default_value": true },
|
||||
"machine_extruder_start_pos_x": { "default_value": 180 },
|
||||
"machine_extruder_start_pos_y": { "default_value": 180 },
|
||||
"machine_extruder_end_pos_abs": { "default_value": true },
|
||||
"machine_extruder_end_pos_x": { "default_value": 180 },
|
||||
"machine_extruder_end_pos_y": { "default_value": 180 },
|
||||
"machine_nozzle_head_distance": { "default_value": 2.7 },
|
||||
"extruder_prime_pos_x": { "default_value": -3 },
|
||||
"extruder_prime_pos_y": { "default_value": 6 },
|
||||
"extruder_prime_pos_z": { "default_value": 2 }
|
||||
}
|
||||
}
|
30
resources/extruders/ultimaker_s3_extruder_right.def.json
Normal file
30
resources/extruders/ultimaker_s3_extruder_right.def.json
Normal file
|
@ -0,0 +1,30 @@
|
|||
{
|
||||
"id": "ultimaker_s3_extruder_right",
|
||||
"version": 2,
|
||||
"name": "Extruder 2",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata": {
|
||||
"machine": "ultimaker_s3",
|
||||
"position": "1"
|
||||
},
|
||||
|
||||
"overrides": {
|
||||
"extruder_nr": {
|
||||
"default_value": 1,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_nozzle_offset_x": { "default_value": 22 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 },
|
||||
|
||||
"machine_extruder_start_pos_abs": { "default_value": true },
|
||||
"machine_extruder_start_pos_x": { "default_value": 180 },
|
||||
"machine_extruder_start_pos_y": { "default_value": 180 },
|
||||
"machine_extruder_end_pos_abs": { "default_value": true },
|
||||
"machine_extruder_end_pos_x": { "default_value": 180 },
|
||||
"machine_extruder_end_pos_y": { "default_value": 180 },
|
||||
"machine_nozzle_head_distance": { "default_value": 4.2 },
|
||||
"extruder_prime_pos_x": { "default_value": 180 },
|
||||
"extruder_prime_pos_y": { "default_value": 6 },
|
||||
"extruder_prime_pos_z": { "default_value": 2 }
|
||||
}
|
||||
}
|
BIN
resources/images/UltimakerS3backplate.png
Normal file
BIN
resources/images/UltimakerS3backplate.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
8031
resources/meshes/ultimaker_s3_platform.obj
Normal file
8031
resources/meshes/ultimaker_s3_platform.obj
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,20 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_abs
|
||||
variant = AA 0.25
|
||||
|
||||
[values]
|
||||
cool_fan_speed = 40
|
||||
infill_overlap = 15
|
||||
material_final_print_temperature = =material_print_temperature - 5
|
||||
retraction_prime_speed = 25
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||
wall_thickness = 0.92
|
|
@ -0,0 +1,20 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_cpe
|
||||
variant = AA 0.25
|
||||
|
||||
[values]
|
||||
retraction_combing_max_distance = 50
|
||||
retraction_extrusion_window = 0.5
|
||||
speed_infill = =math.ceil(speed_print * 40 / 55)
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||
top_bottom_thickness = 0.8
|
||||
wall_thickness = 0.92
|
|
@ -0,0 +1,35 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_nylon
|
||||
variant = AA 0.25
|
||||
|
||||
[values]
|
||||
cool_min_layer_time_fan_speed_max = 20
|
||||
cool_min_speed = 12
|
||||
infill_line_width = =round(line_width * 0.5 / 0.4, 2)
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_heat_up_speed = 1.4
|
||||
ooze_shield_angle = 40
|
||||
raft_acceleration = =acceleration_layer_0
|
||||
raft_airgap = =round(layer_height_0 * 0.85, 2)
|
||||
raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 3)
|
||||
raft_jerk = =jerk_layer_0
|
||||
raft_margin = 10
|
||||
raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2)
|
||||
retraction_min_travel = 5
|
||||
skin_overlap = 50
|
||||
speed_print = 70
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 70)
|
||||
speed_wall = =math.ceil(speed_print * 30 / 70)
|
||||
switch_extruder_prime_speed = 30
|
||||
switch_extruder_retraction_amount = 30
|
||||
switch_extruder_retraction_speeds = 40
|
||||
wall_line_width_x = =wall_line_width
|
|
@ -0,0 +1,55 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine - Experimental
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_pc
|
||||
variant = AA 0.25
|
||||
is_experimental = True
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
adhesion_type = brim
|
||||
brim_width = 20
|
||||
cool_fan_full_at_height = =layer_height_0 + layer_height
|
||||
cool_fan_speed_max = 50
|
||||
cool_min_layer_time_fan_speed_max = 5
|
||||
cool_min_speed = 5
|
||||
infill_line_width = =line_width
|
||||
infill_pattern = triangles
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
multiple_mesh_overlap = 0
|
||||
ooze_shield_angle = 40
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
raft_airgap = 0.25
|
||||
raft_interface_thickness = =max(layer_height * 1.5, 0.225)
|
||||
retraction_count_max = 80
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 15
|
||||
skin_overlap = 30
|
||||
speed_layer_0 = =math.ceil(speed_print * 25 / 50)
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_interface_density = 87.5
|
||||
support_interface_pattern = lines
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =line_width
|
||||
wall_thickness = 1.2
|
|
@ -0,0 +1,36 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_pla
|
||||
variant = AA 0.25
|
||||
|
||||
[values]
|
||||
brim_width = 8
|
||||
cool_fan_full_at_height = =layer_height_0
|
||||
cool_min_speed = 10
|
||||
infill_overlap = 10
|
||||
infill_pattern = grid
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_heat_up_speed = 1.4
|
||||
material_final_print_temperature = =max(-273.15, material_print_temperature - 15)
|
||||
material_initial_print_temperature = =max(-273.15, material_print_temperature - 10)
|
||||
material_print_temperature = 190
|
||||
retraction_hop = 0.2
|
||||
skin_overlap = 5
|
||||
speed_layer_0 = =speed_print
|
||||
speed_print = 30
|
||||
speed_travel_layer_0 = 120
|
||||
speed_wall = =math.ceil(speed_print * 25 / 30)
|
||||
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
||||
top_bottom_thickness = 0.72
|
||||
travel_avoid_distance = 0.4
|
||||
wall_0_inset = 0.015
|
||||
wall_0_wipe_dist = 0.25
|
||||
wall_thickness = 0.7
|
|
@ -0,0 +1,59 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine - Experimental
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_pp
|
||||
variant = AA 0.25
|
||||
is_experimental = True
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
brim_width = 10
|
||||
cool_fan_speed_max = 100
|
||||
cool_min_layer_time_fan_speed_max = 5
|
||||
cool_min_speed = 2.5
|
||||
infill_line_width = =round(line_width * 0.38 / 0.38, 2)
|
||||
infill_pattern = tetrahedral
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
line_width = =machine_nozzle_size * 0.92
|
||||
machine_min_cool_heat_time_window = 15
|
||||
material_bed_temperature_layer_0 = =material_bed_temperature + 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature - 15
|
||||
material_print_temperature_layer_0 = =material_print_temperature + 3
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_enable = False
|
||||
prime_tower_size = 16
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_count_max = 6
|
||||
retraction_extra_prime_amount = 0.2
|
||||
retraction_extrusion_window = 6.5
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 13
|
||||
speed_equalize_flow_enabled = True
|
||||
speed_layer_0 = =math.ceil(speed_print * 15 / 25)
|
||||
speed_print = 25
|
||||
speed_travel_layer_0 = 50
|
||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||
support_angle = 50
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
top_bottom_thickness = 1
|
||||
travel_avoid_distance = 3
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =line_width
|
||||
wall_thickness = =line_width * 3
|
|
@ -0,0 +1,40 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_tough_pla
|
||||
variant = AA 0.25
|
||||
|
||||
[values]
|
||||
brim_width = 8
|
||||
cool_fan_full_at_height = =layer_height_0
|
||||
cool_min_speed = 7
|
||||
infill_line_width = =line_width
|
||||
infill_overlap = 10
|
||||
infill_pattern = grid
|
||||
line_width = =machine_nozzle_size * 0.92
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_heat_up_speed = 1.4
|
||||
material_final_print_temperature = =max(-273.15, material_print_temperature - 15)
|
||||
material_initial_print_temperature = =max(-273.15, material_print_temperature - 10)
|
||||
material_print_temperature = =default_material_print_temperature - 15
|
||||
skin_overlap = 5
|
||||
speed_layer_0 = =math.ceil(speed_print * 30 / 30)
|
||||
speed_print = 30
|
||||
speed_topbottom = =math.ceil(speed_print * 20 / 30)
|
||||
speed_travel_layer_0 = 120
|
||||
speed_wall = =math.ceil(speed_print * 25 / 30)
|
||||
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
||||
top_bottom_thickness = 0.72
|
||||
wall_0_inset = 0.015
|
||||
wall_0_wipe_dist = 0.25
|
||||
wall_line_width = =line_width
|
||||
wall_line_width_x= =line_width
|
||||
wall_thickness = 0.7
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_abs
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_print_temperature = =default_material_print_temperature + 20
|
||||
material_initial_print_temperature = =material_print_temperature - 15
|
||||
material_final_print_temperature = =material_print_temperature - 20
|
||||
prime_tower_enable = False
|
||||
skin_overlap = 20
|
||||
speed_print = 60
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 60)
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
||||
speed_wall = =math.ceil(speed_print * 45 / 60)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||
wall_thickness = 1
|
||||
|
||||
infill_line_width = =round(line_width * 0.4 / 0.35, 2)
|
||||
speed_infill = =math.ceil(speed_print * 50 / 60)
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_abs
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_min_speed = 7
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_print_temperature = =default_material_print_temperature + 15
|
||||
material_initial_print_temperature = =material_print_temperature - 15
|
||||
material_final_print_temperature = =material_print_temperature - 20
|
||||
prime_tower_enable = False
|
||||
speed_print = 60
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 60)
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 60)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||
|
||||
infill_line_width = =round(line_width * 0.4 / 0.35, 2)
|
||||
speed_infill = =math.ceil(speed_print * 45 / 60)
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Extra Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = high
|
||||
weight = 1
|
||||
material = generic_abs
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_min_speed = 12
|
||||
machine_nozzle_cool_down_speed = 0.8
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
material_initial_print_temperature = =material_print_temperature - 15
|
||||
material_final_print_temperature = =material_print_temperature - 20
|
||||
prime_tower_enable = False
|
||||
speed_print = 50
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 50)
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 30 / 50)
|
||||
|
||||
infill_line_width = =round(line_width * 0.4 / 0.35, 2)
|
||||
speed_infill = =math.ceil(speed_print * 40 / 50)
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_abs
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
material_initial_print_temperature = =material_print_temperature - 15
|
||||
material_final_print_temperature = =material_print_temperature - 20
|
||||
prime_tower_enable = False
|
||||
speed_print = 55
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 55)
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||
speed_wall = =math.ceil(speed_print * 30 / 55)
|
||||
|
||||
infill_line_width = =round(line_width * 0.4 / 0.35, 2)
|
||||
speed_infill = =math.ceil(speed_print * 40 / 55)
|
|
@ -0,0 +1,40 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_bam
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
brim_replaces_support = False
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
# prime_tower_enable: see CURA-4248
|
||||
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
|
||||
skin_overlap = 20
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 70)
|
||||
speed_wall = =math.ceil(speed_print * 50 / 70)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 50)
|
||||
top_bottom_thickness = 1
|
||||
wall_thickness = 1
|
||||
support_brim_enable = True
|
||||
support_interface_enable = True
|
||||
support_interface_density = =min(extruderValues('material_surface_energy'))
|
||||
support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric'
|
||||
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
|
||||
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
|
||||
support_angle = 45
|
||||
support_join_distance = 5
|
||||
support_offset = 2
|
||||
support_pattern = triangles
|
||||
support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
|
|
@ -0,0 +1,39 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_bam
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
brim_replaces_support = False
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
# prime_tower_enable: see CURA-4248
|
||||
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
|
||||
speed_print = 80
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 80)
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 80)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 80)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||
top_bottom_thickness = 1
|
||||
wall_thickness = 1
|
||||
support_brim_enable = True
|
||||
support_interface_enable = True
|
||||
support_interface_density = =min(extruderValues('material_surface_energy'))
|
||||
support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric'
|
||||
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height
|
||||
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
|
||||
support_angle = 45
|
||||
support_join_distance = 5
|
||||
support_offset = 2
|
||||
support_pattern = triangles
|
||||
support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
|
|
@ -0,0 +1,38 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_bam
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
brim_replaces_support = False
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
cool_min_speed = 7
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_print_temperature = =default_material_print_temperature - 10
|
||||
# prime_tower_enable: see CURA-4248
|
||||
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
|
||||
skin_overlap = 10
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
support_brim_enable = True
|
||||
support_interface_enable = True
|
||||
support_interface_density = =min(extruderValues('material_surface_energy'))
|
||||
support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric'
|
||||
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height
|
||||
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
|
||||
support_angle = 45
|
||||
support_join_distance = 5
|
||||
support_offset = 2
|
||||
support_pattern = triangles
|
||||
support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10
|
||||
top_bottom_thickness = 1
|
||||
wall_thickness = 1
|
|
@ -0,0 +1,48 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_cpe_plus
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
cool_fan_speed_max = 80
|
||||
cool_min_speed = 5
|
||||
infill_line_width = =round(line_width * 0.35 / 0.35, 2)
|
||||
infill_overlap = 0
|
||||
infill_wipe_dist = 0
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
material_print_temperature_layer_0 = =material_print_temperature
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_combing_max_distance = 50
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 0.2
|
||||
retraction_hop_enabled = False
|
||||
retraction_hop_only_when_collides = True
|
||||
skin_overlap = 20
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 50)
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 40 / 50)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 50 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 40 / 50)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_z_distance = =layer_height
|
||||
wall_0_inset = 0
|
||||
wall_thickness = 1
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_cpe_plus
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
cool_fan_speed_max = 80
|
||||
cool_min_speed = 6
|
||||
infill_line_width = =round(line_width * 0.35 / 0.35, 2)
|
||||
infill_overlap = 0
|
||||
infill_wipe_dist = 0
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
material_print_temperature_layer_0 = =material_print_temperature
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_combing_max_distance = 50
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 0.2
|
||||
retraction_hop_enabled = False
|
||||
retraction_hop_only_when_collides = True
|
||||
skin_overlap = 20
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||
speed_print = 45
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 45 / 45)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_z_distance = =layer_height
|
||||
wall_0_inset = 0
|
|
@ -0,0 +1,48 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Extra Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = high
|
||||
weight = 1
|
||||
material = generic_cpe_plus
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
cool_fan_speed_max = 50
|
||||
cool_min_speed = 5
|
||||
infill_line_width = =round(line_width * 0.35 / 0.35, 2)
|
||||
infill_overlap = 0
|
||||
infill_wipe_dist = 0
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature + 2
|
||||
material_print_temperature_layer_0 = =material_print_temperature
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_combing_max_distance = 50
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 0.2
|
||||
retraction_hop_enabled = False
|
||||
retraction_hop_only_when_collides = True
|
||||
skin_overlap = 20
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 40)
|
||||
speed_print = 40
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 35 / 40)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_z_distance = =layer_height
|
||||
wall_0_inset = 0
|
|
@ -0,0 +1,48 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_cpe_plus
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
cool_fan_speed_max = 50
|
||||
cool_min_speed = 7
|
||||
infill_line_width = =round(line_width * 0.35 / 0.35, 2)
|
||||
infill_overlap = 0
|
||||
infill_wipe_dist = 0
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
material_print_temperature_layer_0 = =material_print_temperature
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_combing_max_distance = 50
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 0.2
|
||||
retraction_hop_enabled = False
|
||||
retraction_hop_only_when_collides = True
|
||||
skin_overlap = 20
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 40)
|
||||
speed_print = 40
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 35 / 40)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_z_distance = =layer_height
|
||||
wall_0_inset = 0
|
|
@ -0,0 +1,29 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_cpe
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
retraction_combing_max_distance = 50
|
||||
skin_overlap = 20
|
||||
speed_print = 60
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 60)
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
||||
speed_wall = =math.ceil(speed_print * 45 / 60)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||
wall_thickness = 1
|
||||
|
||||
|
||||
infill_pattern = triangles
|
||||
speed_infill = =math.ceil(speed_print * 50 / 60)
|
|
@ -0,0 +1,27 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_cpe
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_min_speed = 7
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
retraction_combing_max_distance = 50
|
||||
speed_print = 60
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 60)
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 60)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||
|
||||
infill_pattern = triangles
|
||||
speed_infill = =math.ceil(speed_print * 50 / 60)
|
|
@ -0,0 +1,28 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Extra Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = high
|
||||
weight = 1
|
||||
material = generic_cpe
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_min_speed = 12
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_print_temperature = =default_material_print_temperature - 5
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
retraction_combing_max_distance = 50
|
||||
speed_print = 50
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 50)
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 30 / 50)
|
||||
|
||||
infill_pattern = triangles
|
||||
speed_infill = =math.ceil(speed_print * 40 / 50)
|
|
@ -0,0 +1,26 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_cpe
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
retraction_combing_max_distance = 50
|
||||
speed_print = 55
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 55)
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||
speed_wall = =math.ceil(speed_print * 30 / 55)
|
||||
|
||||
infill_pattern = triangles
|
||||
speed_infill = =math.ceil(speed_print * 45 / 55)
|
|
@ -0,0 +1,38 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_nylon
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
adhesion_type = brim
|
||||
cool_min_layer_time_fan_speed_max = 20
|
||||
cool_min_speed = 10
|
||||
infill_line_width = =round(line_width * 0.5 / 0.4, 2)
|
||||
line_width = =machine_nozzle_size
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_standby_temperature = 100
|
||||
ooze_shield_angle = 40
|
||||
raft_acceleration = =acceleration_layer_0
|
||||
raft_airgap = =round(layer_height_0 * 0.85, 2)
|
||||
raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2)
|
||||
raft_jerk = =jerk_layer_0
|
||||
raft_margin = 10
|
||||
raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2)
|
||||
skin_overlap = 50
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
switch_extruder_prime_speed = 30
|
||||
switch_extruder_retraction_amount = 30
|
||||
switch_extruder_retraction_speeds = 40
|
||||
wall_line_width_x = =wall_line_width
|
||||
|
||||
jerk_travel = 50
|
|
@ -0,0 +1,38 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_nylon
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
adhesion_type = brim
|
||||
cool_min_layer_time_fan_speed_max = 20
|
||||
cool_min_speed = 10
|
||||
infill_line_width = =round(line_width * 0.5 / 0.4, 2)
|
||||
line_width = =machine_nozzle_size
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_standby_temperature = 100
|
||||
ooze_shield_angle = 40
|
||||
raft_acceleration = =acceleration_layer_0
|
||||
raft_airgap = =round(layer_height_0 * 0.85, 2)
|
||||
raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2)
|
||||
raft_jerk = =jerk_layer_0
|
||||
raft_margin = 10
|
||||
raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2)
|
||||
skin_overlap = 50
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
switch_extruder_prime_speed = 30
|
||||
switch_extruder_retraction_amount = 30
|
||||
switch_extruder_retraction_speeds = 40
|
||||
wall_line_width_x = =wall_line_width
|
||||
|
||||
jerk_travel = 50
|
|
@ -0,0 +1,37 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Extra Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = high
|
||||
weight = 1
|
||||
material = generic_nylon
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
adhesion_type = brim
|
||||
cool_min_layer_time_fan_speed_max = 20
|
||||
cool_min_speed = 15
|
||||
infill_line_width = =round(line_width * 0.5 / 0.4, 2)
|
||||
line_width = =machine_nozzle_size
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_standby_temperature = 100
|
||||
ooze_shield_angle = 40
|
||||
raft_acceleration = =acceleration_layer_0
|
||||
raft_airgap = =round(layer_height_0 * 0.85, 2)
|
||||
raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2)
|
||||
raft_jerk = =jerk_layer_0
|
||||
raft_margin = 10
|
||||
raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2)
|
||||
skin_overlap = 50
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
switch_extruder_prime_speed = 30
|
||||
switch_extruder_retraction_amount = 30
|
||||
switch_extruder_retraction_speeds = 40
|
||||
wall_line_width_x = =wall_line_width
|
||||
|
||||
jerk_travel = 50
|
|
@ -0,0 +1,37 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_nylon
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
adhesion_type = brim
|
||||
cool_min_layer_time_fan_speed_max = 20
|
||||
cool_min_speed = 12
|
||||
infill_line_width = =round(line_width * 0.5 / 0.4, 2)
|
||||
line_width = =machine_nozzle_size
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_standby_temperature = 100
|
||||
ooze_shield_angle = 40
|
||||
raft_acceleration = =acceleration_layer_0
|
||||
raft_airgap = =round(layer_height_0 * 0.85, 2)
|
||||
raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2)
|
||||
raft_jerk = =jerk_layer_0
|
||||
raft_margin = 10
|
||||
raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2)
|
||||
skin_overlap = 50
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
switch_extruder_prime_speed = 30
|
||||
switch_extruder_retraction_amount = 30
|
||||
switch_extruder_retraction_speeds = 40
|
||||
wall_line_width_x = =wall_line_width
|
||||
|
||||
jerk_travel = 50
|
|
@ -0,0 +1,63 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_pc
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
adhesion_type = brim
|
||||
brim_width = 20
|
||||
cool_fan_full_at_height = =layer_height_0 + layer_height
|
||||
cool_fan_speed_max = 90
|
||||
cool_min_layer_time_fan_speed_max = 5
|
||||
cool_min_speed = 6
|
||||
infill_line_width = =round(line_width * 0.4 / 0.35, 2)
|
||||
infill_overlap = 0
|
||||
infill_overlap_mm = 0.05
|
||||
infill_pattern = triangles
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
ooze_shield_angle = 40
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
raft_airgap = 0.25
|
||||
raft_interface_thickness = =max(layer_height * 1.5, 0.225)
|
||||
retraction_count_max = 80
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 15
|
||||
skin_overlap = 30
|
||||
speed_layer_0 = =math.ceil(speed_print * 25 / 50)
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_interface_density = 87.5
|
||||
support_interface_pattern = lines
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =round(line_width * 0.4 / 0.35, 2)
|
||||
wall_thickness = 1.2
|
|
@ -0,0 +1,63 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_pc
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
adhesion_type = brim
|
||||
brim_width = 20
|
||||
cool_fan_full_at_height = =layer_height_0 + layer_height
|
||||
cool_fan_speed_max = 85
|
||||
cool_min_layer_time_fan_speed_max = 5
|
||||
cool_min_speed = 7
|
||||
infill_line_width = =round(line_width * 0.4 / 0.35, 2)
|
||||
infill_overlap_mm = 0.05
|
||||
infill_pattern = triangles
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
ooze_shield_angle = 40
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
raft_airgap = 0.25
|
||||
raft_interface_thickness = =max(layer_height * 1.5, 0.225)
|
||||
retraction_count_max = 80
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 15
|
||||
skin_overlap = 30
|
||||
speed_layer_0 = =math.ceil(speed_print * 25 / 50)
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_interface_density = 87.5
|
||||
support_interface_pattern = lines
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =round(line_width * 0.4 / 0.35, 2)
|
||||
wall_thickness = 1.2
|
|
@ -0,0 +1,64 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Extra Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = high
|
||||
weight = 1
|
||||
material = generic_pc
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
adhesion_type = brim
|
||||
brim_width = 20
|
||||
cool_fan_full_at_height = =layer_height_0 + layer_height
|
||||
cool_fan_speed_max = 50
|
||||
cool_min_layer_time_fan_speed_max = 5
|
||||
cool_min_speed = 8
|
||||
infill_line_width = =round(line_width * 0.4 / 0.35, 2)
|
||||
infill_overlap = 0
|
||||
infill_overlap_mm = 0.05
|
||||
infill_pattern = triangles
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature - 10
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
ooze_shield_angle = 40
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
raft_airgap = 0.25
|
||||
raft_interface_thickness = =max(layer_height * 1.5, 0.225)
|
||||
retraction_count_max = 80
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 15
|
||||
skin_overlap = 30
|
||||
speed_layer_0 = =math.ceil(speed_print * 25 / 50)
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_interface_density = 87.5
|
||||
support_interface_pattern = lines
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =round(line_width * 0.4 / 0.35, 2)
|
||||
wall_thickness = 1.2
|
|
@ -0,0 +1,62 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_pc
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
adhesion_type = brim
|
||||
brim_width = 20
|
||||
cool_fan_full_at_height = =layer_height_0 + layer_height
|
||||
cool_fan_speed_max = 50
|
||||
cool_min_layer_time_fan_speed_max = 5
|
||||
cool_min_speed = 5
|
||||
infill_line_width = =round(line_width * 0.4 / 0.35, 2)
|
||||
infill_overlap = 0
|
||||
infill_pattern = triangles
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
ooze_shield_angle = 40
|
||||
prime_tower_enable = True
|
||||
prime_tower_wipe_enabled = True
|
||||
raft_airgap = 0.25
|
||||
raft_interface_thickness = =max(layer_height * 1.5, 0.225)
|
||||
retraction_count_max = 80
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 15
|
||||
skin_overlap = 30
|
||||
speed_layer_0 = =math.ceil(speed_print * 25 / 50)
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||
support_bottom_distance = =support_z_distance
|
||||
support_interface_density = 87.5
|
||||
support_interface_pattern = lines
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =round(line_width * 0.4 / 0.35, 2)
|
||||
wall_thickness = 1.2
|
|
@ -0,0 +1,35 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_pla
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
material_standby_temperature = 100
|
||||
prime_tower_enable = False
|
||||
skin_overlap = 20
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
speed_topbottom = =math.ceil(speed_print * 40 / 70)
|
||||
speed_wall = =math.ceil(speed_print * 55 / 70)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 45 / 50)
|
||||
top_bottom_thickness = 0.8
|
||||
wall_thickness = 0.8
|
||||
|
||||
jerk_travel = 50
|
||||
infill_line_width = =round(line_width * 0.42 / 0.35, 2)
|
||||
infill_sparse_density = 15
|
||||
layer_height_0 = 0.2
|
||||
acceleration_wall = 2000
|
||||
acceleration_wall_0 = 2000
|
|
@ -0,0 +1,31 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_pla
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_standby_temperature = 100
|
||||
prime_tower_enable = False
|
||||
speed_print = 70
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 70)
|
||||
speed_wall = =math.ceil(speed_print * 45 / 70)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 70)
|
||||
top_bottom_thickness = 1
|
||||
wall_thickness = 1
|
||||
|
||||
jerk_travel = 50
|
||||
infill_line_width = =round(line_width * 0.42 / 0.35, 2)
|
||||
layer_height_0 = 0.2
|
|
@ -0,0 +1,33 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Extra Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = high
|
||||
weight = 1
|
||||
material = generic_pla
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
cool_min_speed = 10
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_print_temperature = =default_material_print_temperature - 5
|
||||
material_standby_temperature = 100
|
||||
prime_tower_enable = False
|
||||
skin_overlap = 10
|
||||
speed_print = 50
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 50)
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 35 / 50)
|
||||
top_bottom_thickness = 1
|
||||
wall_thickness = 1
|
||||
|
||||
jerk_travel = 50
|
||||
infill_line_width = =round(line_width * 0.42 / 0.35, 2)
|
||||
layer_height_0 = 0.2
|
|
@ -0,0 +1,29 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_pla
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
cool_min_speed = 7
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_standby_temperature = 100
|
||||
prime_tower_enable = False
|
||||
skin_overlap = 10
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 70)
|
||||
top_bottom_thickness = 1
|
||||
wall_thickness = 1
|
||||
|
||||
jerk_travel = 50
|
||||
infill_line_width = =round(line_width * 0.42 / 0.35, 2)
|
||||
layer_height_0 = 0.2
|
|
@ -0,0 +1,62 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_pp
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
brim_width = 20
|
||||
cool_fan_speed_max = 100
|
||||
cool_min_layer_time = 7
|
||||
cool_min_layer_time_fan_speed_max = 7
|
||||
cool_min_speed = 2.5
|
||||
infill_line_width = =round(line_width * 0.38 / 0.38, 2)
|
||||
infill_overlap = 0
|
||||
infill_pattern = tetrahedral
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
line_width = =machine_nozzle_size * 0.95
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_bed_temperature_layer_0 = =material_bed_temperature + 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature - 5
|
||||
material_print_temperature_layer_0 = =material_print_temperature + 5
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_enable = False
|
||||
prime_tower_size = 16
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_count_max = 12
|
||||
retraction_extra_prime_amount = 0.8
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 18
|
||||
speed_equalize_flow_enabled = True
|
||||
speed_layer_0 = =math.ceil(speed_print * 15 / 25)
|
||||
speed_print = 25
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||
speed_travel_layer_0 = 50
|
||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||
support_angle = 50
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =line_width
|
||||
wall_thickness = =line_width * 3
|
|
@ -0,0 +1,64 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_pp
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
brim_width = 20
|
||||
cool_fan_speed_max = 100
|
||||
cool_min_layer_time = 7
|
||||
cool_min_layer_time_fan_speed_max = 7
|
||||
cool_min_speed = 2.5
|
||||
infill_line_width = =round(line_width * 0.38 / 0.38, 2)
|
||||
infill_overlap = 0
|
||||
infill_pattern = tetrahedral
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
line_width = =machine_nozzle_size * 0.95
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_bed_temperature_layer_0 = =material_bed_temperature + 5
|
||||
material_final_print_temperature = =material_print_temperature - 12
|
||||
material_initial_print_temperature = =material_print_temperature - 2
|
||||
material_print_temperature = =default_material_print_temperature - 13
|
||||
material_print_temperature_layer_0 = =material_print_temperature + 3
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_enable = False
|
||||
prime_tower_size = 16
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_count_max = 12
|
||||
retraction_extra_prime_amount = 0.8
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 18
|
||||
speed_equalize_flow_enabled = True
|
||||
speed_layer_0 = =math.ceil(speed_print * 15 / 25)
|
||||
speed_print = 25
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||
|
||||
speed_travel_layer_0 = 50
|
||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||
support_angle = 50
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
top_bottom_thickness = 1.1
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =line_width
|
||||
wall_thickness = =line_width * 3
|
|
@ -0,0 +1,64 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_pp
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
brim_width = 20
|
||||
cool_fan_speed_max = 100
|
||||
cool_min_layer_time = 7
|
||||
cool_min_layer_time_fan_speed_max = 7
|
||||
cool_min_speed = 2.5
|
||||
infill_line_width = =round(line_width * 0.38 / 0.38, 2)
|
||||
infill_overlap = 0
|
||||
infill_pattern = tetrahedral
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
line_width = =machine_nozzle_size * 0.95
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.85
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
material_bed_temperature_layer_0 = =material_bed_temperature + 5
|
||||
material_final_print_temperature = =material_print_temperature - 10
|
||||
material_initial_print_temperature = =material_print_temperature - 5
|
||||
material_print_temperature = =default_material_print_temperature - 15
|
||||
material_print_temperature_layer_0 = =material_print_temperature + 3
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_enable = False
|
||||
prime_tower_size = 16
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_count_max = 12
|
||||
retraction_extra_prime_amount = 0.8
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop = 2
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = 0.8
|
||||
retraction_prime_speed = 18
|
||||
speed_equalize_flow_enabled = True
|
||||
speed_layer_0 = =math.ceil(speed_print * 15 / 25)
|
||||
speed_print = 25
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||
|
||||
speed_travel_layer_0 = 50
|
||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||
support_angle = 50
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
top_bottom_thickness = 1
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =line_width
|
||||
wall_thickness = =line_width * 3
|
|
@ -0,0 +1,38 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_tough_pla
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
cool_min_speed = 7
|
||||
infill_line_width = =round(line_width * 0.45/0.35,2)
|
||||
jerk_print = 25
|
||||
jerk_roofing = 1
|
||||
layer_height_0 = 0.2
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_print_temperature = =default_material_print_temperature -10
|
||||
material_standby_temperature = 100
|
||||
prime_tower_enable = False
|
||||
roofing_layer_count = 2
|
||||
skin_outline_count = 0
|
||||
skin_overlap = 20
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 50)
|
||||
speed_print = 50
|
||||
speed_roofing = =math.ceil(speed_wall * 20 / 24)
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 36 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_print * 26 / 50)
|
||||
top_bottom_thickness = 1.2
|
||||
wall_line_width_x = =round(line_width * 0.35/0.35,2)
|
||||
wall_thickness = 1.2
|
|
@ -0,0 +1,31 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_tough_pla
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
infill_line_width = =round(line_width * 1.285, 2)
|
||||
layer_height_0 = 0.2
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_print_temperature = =default_material_print_temperature -10
|
||||
material_standby_temperature = 100
|
||||
prime_tower_enable = False
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||
speed_print = 45
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 45)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||
top_bottom_thickness = 1.2
|
||||
wall_line_width_x = =round(line_width * 0.35/0.35,2)
|
||||
wall_thickness = 1.23
|
|
@ -0,0 +1,36 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Extra Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = high
|
||||
weight = 1
|
||||
material = generic_tough_pla
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
cool_min_speed = 10
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_print_temperature = =default_material_print_temperature - 15
|
||||
material_standby_temperature = 100
|
||||
prime_tower_enable = False
|
||||
skin_overlap = 10
|
||||
speed_print = 45
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 45)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||
top_bottom_thickness = 1.2
|
||||
wall_thickness = 1.23
|
||||
|
||||
layer_height_0 = 0.2
|
||||
|
||||
line_width = =round(machine_nozzle_size * 1.025, 3)
|
||||
wall_line_width_x = =line_width
|
||||
infill_line_width = =line_width
|
|
@ -0,0 +1,33 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_tough_pla
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
cool_fan_full_at_height = =layer_height_0 + 2 * layer_height
|
||||
cool_fan_speed_max = =cool_fan_speed
|
||||
cool_min_speed = 7
|
||||
infill_line_width = =round(line_width * 1.285, 2)
|
||||
layer_height_0 = 0.2
|
||||
machine_nozzle_cool_down_speed = 0.75
|
||||
machine_nozzle_heat_up_speed = 1.6
|
||||
material_print_temperature = =default_material_print_temperature - 15
|
||||
material_standby_temperature = 100
|
||||
prime_tower_enable = False
|
||||
skin_overlap = 10
|
||||
speed_layer_0 = =math.ceil(speed_print * 20 / 45)
|
||||
speed_print = 45
|
||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 45)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||
top_bottom_thickness = 1.2
|
||||
wall_thickness = 1.23
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_tpu
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
brim_width = 8.75
|
||||
cool_fan_speed_max = 100
|
||||
cool_min_layer_time_fan_speed_max = 6
|
||||
cool_min_speed = 4
|
||||
gradual_infill_step_height = =5 * layer_height
|
||||
infill_line_width = =round(line_width * 0.38 / 0.38, 2)
|
||||
infill_overlap = 0
|
||||
infill_pattern = cross_3d
|
||||
infill_sparse_density = 10
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
line_width = =machine_nozzle_size * 0.95
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.5
|
||||
machine_nozzle_heat_up_speed = 2.5
|
||||
material_final_print_temperature = =material_print_temperature
|
||||
material_flow = 106
|
||||
material_initial_print_temperature = =material_print_temperature
|
||||
material_print_temperature = =default_material_print_temperature + 2
|
||||
material_print_temperature_layer_0 = =material_print_temperature + 15
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_count_max = 12
|
||||
retraction_extra_prime_amount = 0.8
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = =line_width * 2
|
||||
retraction_prime_speed = 15
|
||||
skin_overlap = 5
|
||||
speed_equalize_flow_enabled = True
|
||||
speed_layer_0 = =math.ceil(speed_print * 18 / 25)
|
||||
speed_print = 25
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||
support_angle = 50
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
top_bottom_thickness = 0.7
|
||||
travel_avoid_distance = 1.5
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =line_width
|
||||
wall_thickness = 0.76
|
|
@ -0,0 +1,64 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Normal
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = fast
|
||||
weight = -1
|
||||
material = generic_tpu
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
brim_width = 8.75
|
||||
cool_fan_speed_max = 100
|
||||
cool_min_layer_time_fan_speed_max = 6
|
||||
cool_min_speed = 4
|
||||
gradual_infill_step_height = =5 * layer_height
|
||||
infill_line_width = =round(line_width * 0.38 / 0.38, 2)
|
||||
infill_overlap = 0
|
||||
infill_pattern = cross_3d
|
||||
infill_sparse_density = 10
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
line_width = =machine_nozzle_size * 0.95
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.5
|
||||
machine_nozzle_heat_up_speed = 2.5
|
||||
material_final_print_temperature = =material_print_temperature
|
||||
material_flow = 106
|
||||
material_initial_print_temperature = =material_print_temperature
|
||||
material_print_temperature = =default_material_print_temperature + 2
|
||||
material_print_temperature_layer_0 = =material_print_temperature + 15
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_count_max = 12
|
||||
retraction_extra_prime_amount = 0.8
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = =line_width * 2
|
||||
retraction_prime_speed = 15
|
||||
skin_overlap = 5
|
||||
speed_equalize_flow_enabled = True
|
||||
speed_layer_0 = =math.ceil(speed_print * 18 / 25)
|
||||
speed_print = 25
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||
support_angle = 50
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
top_bottom_thickness = 0.7
|
||||
travel_avoid_distance = 1.5
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =line_width
|
||||
wall_thickness = 0.76
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fine
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = normal
|
||||
weight = 0
|
||||
material = generic_tpu
|
||||
variant = AA 0.4
|
||||
|
||||
[values]
|
||||
acceleration_enabled = True
|
||||
acceleration_print = 4000
|
||||
brim_width = 8.75
|
||||
cool_fan_speed_max = 100
|
||||
cool_min_layer_time_fan_speed_max = 6
|
||||
cool_min_speed = 4
|
||||
gradual_infill_step_height = =5 * layer_height
|
||||
infill_line_width = =round(line_width * 0.38 / 0.38, 2)
|
||||
infill_overlap = 0
|
||||
infill_pattern = cross_3d
|
||||
infill_sparse_density = 10
|
||||
infill_wipe_dist = 0.1
|
||||
jerk_enabled = True
|
||||
jerk_print = 25
|
||||
line_width = =machine_nozzle_size * 0.95
|
||||
machine_min_cool_heat_time_window = 15
|
||||
machine_nozzle_cool_down_speed = 0.5
|
||||
machine_nozzle_heat_up_speed = 2.5
|
||||
material_final_print_temperature = =material_print_temperature
|
||||
material_flow = 106
|
||||
material_initial_print_temperature = =material_print_temperature
|
||||
material_print_temperature_layer_0 = =material_print_temperature + 17
|
||||
material_standby_temperature = 100
|
||||
multiple_mesh_overlap = 0
|
||||
prime_tower_wipe_enabled = True
|
||||
retraction_count_max = 12
|
||||
retraction_extra_prime_amount = 0.8
|
||||
retraction_extrusion_window = 1
|
||||
retraction_hop_only_when_collides = True
|
||||
retraction_min_travel = =line_width * 2
|
||||
retraction_prime_speed = 15
|
||||
skin_overlap = 5
|
||||
speed_equalize_flow_enabled = True
|
||||
speed_layer_0 = =math.ceil(speed_print * 18 / 25)
|
||||
speed_print = 25
|
||||
speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||
|
||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||
support_angle = 50
|
||||
switch_extruder_prime_speed = 15
|
||||
switch_extruder_retraction_amount = 20
|
||||
switch_extruder_retraction_speeds = 35
|
||||
top_bottom_thickness = 0.7
|
||||
travel_avoid_distance = 1.5
|
||||
wall_0_inset = 0
|
||||
wall_line_width_x = =line_width
|
||||
wall_thickness = 0.76
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = draft
|
||||
weight = -2
|
||||
material = generic_abs
|
||||
variant = AA 0.8
|
||||
|
||||
[values]
|
||||
line_width = =machine_nozzle_size * 0.875
|
||||
material_print_temperature = =default_material_print_temperature + 20
|
||||
material_standby_temperature = 100
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||
retract_at_layer_change = False
|
|
@ -0,0 +1,22 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Sprint
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = superdraft
|
||||
weight = -4
|
||||
material = generic_abs
|
||||
variant = AA 0.8
|
||||
|
||||
[values]
|
||||
line_width = =machine_nozzle_size * 0.875
|
||||
material_print_temperature = =default_material_print_temperature + 25
|
||||
material_standby_temperature = 100
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||
retract_at_layer_change = False
|
|
@ -0,0 +1,22 @@
|
|||
[general]
|
||||
version = 4
|
||||
name = Extra Fast
|
||||
definition = ultimaker_s3
|
||||
|
||||
[metadata]
|
||||
setting_version = 9
|
||||
type = quality
|
||||
quality_type = verydraft
|
||||
weight = -3
|
||||
material = generic_abs
|
||||
variant = AA 0.8
|
||||
|
||||
[values]
|
||||
line_width = =machine_nozzle_size * 0.875
|
||||
material_print_temperature = =default_material_print_temperature + 22
|
||||
material_standby_temperature = 100
|
||||
speed_print = 50
|
||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||
retract_at_layer_change = False
|
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