This commit is contained in:
Jaime van Kessel 2016-03-04 10:59:40 +01:00
commit a9bd73f32a
133 changed files with 2246 additions and 1502 deletions

View File

@ -5,8 +5,8 @@ Name[de]=Cura
GenericName=3D Printing Software GenericName=3D Printing Software
GenericName[de]=3D-Druck-Software GenericName[de]=3D-Druck-Software
Comment= Comment=
Exec=/usr/bin/cura_app.py Exec=/usr/bin/cura_app.py %f
TryExec=/usr/bin/cura_app.py TryExec=/usr/bin/cura_app.py %f
Icon=/usr/share/cura/resources/images/cura-icon.png Icon=/usr/share/cura/resources/images/cura-icon.png
Terminal=false Terminal=false
Type=Application Type=Application

View File

@ -9,8 +9,10 @@ class ConvexHullDecorator(SceneNodeDecorator):
# In case of printing all at once this is the same as the convex hull. For one at the time this is the area without the head. # In case of printing all at once this is the same as the convex hull. For one at the time this is the area without the head.
self._convex_hull_boundary = None self._convex_hull_boundary = None
# In case of printing all at once this is the same as the convex hull. For one at the time this is area with full head # In case of printing all at once this is the same as the convex hull. For one at the time this is area with intersection of mirrored head
self._convex_hull_head = None self._convex_hull_head = None
# In case of printing all at once this is the same as the convex hull. For one at the time this is area with intersection of full head
self._convex_hull_head_full = None
self._convex_hull_node = None self._convex_hull_node = None
self._convex_hull_job = None self._convex_hull_job = None
@ -28,6 +30,11 @@ class ConvexHullDecorator(SceneNodeDecorator):
def getConvexHull(self): def getConvexHull(self):
return self._convex_hull return self._convex_hull
def getConvexHullHeadFull(self):
if not self._convex_hull_head_full:
return self.getConvexHull()
return self._convex_hull_head_full
def getConvexHullHead(self): def getConvexHullHead(self):
if not self._convex_hull_head: if not self._convex_hull_head:
return self.getConvexHull() return self.getConvexHull()
@ -41,6 +48,9 @@ class ConvexHullDecorator(SceneNodeDecorator):
def setConvexHullBoundary(self, hull): def setConvexHullBoundary(self, hull):
self._convex_hull_boundary = hull self._convex_hull_boundary = hull
def setConvexHullHeadFull(self, hull):
self._convex_hull_head_full = hull
def setConvexHullHead(self, hull): def setConvexHullHead(self, hull):
self._convex_hull_head = hull self._convex_hull_head = hull

View File

@ -39,7 +39,7 @@ class ConvexHullJob(Job):
mesh = self._node.getMeshData() mesh = self._node.getMeshData()
vertex_data = mesh.getTransformed(self._node.getWorldTransformation()).getVertices() vertex_data = mesh.getTransformed(self._node.getWorldTransformation()).getVertices()
# Don't use data below 0. TODO; We need a better check for this as this gives poor results for meshes with long edges. # Don't use data below 0. TODO; We need a better check for this as this gives poor results for meshes with long edges.
vertex_data = vertex_data[vertex_data[:,1]>0] vertex_data = vertex_data[vertex_data[:,1] >= 0]
hull = Polygon(numpy.rint(vertex_data[:, [0, 2]]).astype(int)) hull = Polygon(numpy.rint(vertex_data[:, [0, 2]]).astype(int))
# First, calculate the normal convex hull around the points # First, calculate the normal convex hull around the points
@ -55,12 +55,16 @@ class ConvexHullJob(Job):
# Printing one at a time and it's not an object in a group # Printing one at a time and it's not an object in a group
self._node.callDecoration("setConvexHullBoundary", copy.deepcopy(hull)) self._node.callDecoration("setConvexHullBoundary", copy.deepcopy(hull))
head_and_fans = Polygon(numpy.array(profile.getSettingValue("machine_head_with_fans_polygon"), numpy.float32)) head_and_fans = Polygon(numpy.array(profile.getSettingValue("machine_head_with_fans_polygon"), numpy.float32))
# Full head hull is used to actually check the order.
full_head_hull = hull.getMinkowskiHull(head_and_fans)
self._node.callDecoration("setConvexHullHeadFull", full_head_hull)
mirrored = copy.deepcopy(head_and_fans) mirrored = copy.deepcopy(head_and_fans)
mirrored.mirror([0, 0], [0, 1]) #Mirror horizontally. mirrored.mirror([0, 0], [0, 1]) #Mirror horizontally.
mirrored.mirror([0, 0], [1, 0]) #Mirror vertically. mirrored.mirror([0, 0], [1, 0]) #Mirror vertically.
head_and_fans = head_and_fans.intersectionConvexHulls(mirrored) head_and_fans = head_and_fans.intersectionConvexHulls(mirrored)
head_hull = hull.getMinkowskiHull(head_and_fans) # Min head hull is used for the push free
self._node.callDecoration("setConvexHullHead", head_hull) min_head_hull = hull.getMinkowskiHull(head_and_fans)
self._node.callDecoration("setConvexHullHead", min_head_hull)
hull = hull.getMinkowskiHull(Polygon(numpy.array(profile.getSettingValue("machine_head_polygon"),numpy.float32))) hull = hull.getMinkowskiHull(Polygon(numpy.array(profile.getSettingValue("machine_head_polygon"),numpy.float32)))
else: else:
self._node.callDecoration("setConvexHullHead", None) self._node.callDecoration("setConvexHullHead", None)

View File

@ -78,6 +78,8 @@ class CuraApplication(QtApplication):
if not hasattr(sys, "frozen"): if not hasattr(sys, "frozen"):
Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..")) Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), ".."))
self._open_file_queue = [] #Files to open when plug-ins are loaded.
super().__init__(name = "cura", version = CuraVersion) super().__init__(name = "cura", version = CuraVersion)
self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png")))
@ -130,6 +132,10 @@ class CuraApplication(QtApplication):
self._recent_files.append(QUrl.fromLocalFile(f)) self._recent_files.append(QUrl.fromLocalFile(f))
@pyqtSlot(result = QUrl)
def getDefaultPath(self):
return QUrl.fromLocalFile(os.path.expanduser("~/"))
## Handle loading of all plugin types (and the backend explicitly) ## Handle loading of all plugin types (and the backend explicitly)
# \sa PluginRegistery # \sa PluginRegistery
def _loadPlugins(self): def _loadPlugins(self):
@ -144,6 +150,8 @@ class CuraApplication(QtApplication):
if self.getBackend() == None: if self.getBackend() == None:
raise RuntimeError("Could not load the backend plugin!") raise RuntimeError("Could not load the backend plugin!")
self._plugins_loaded = True
def addCommandLineOptions(self, parser): def addCommandLineOptions(self, parser):
super().addCommandLineOptions(parser) super().addCommandLineOptions(parser)
parser.add_argument("file", nargs="*", help="Files to load after starting the application.") parser.add_argument("file", nargs="*", help="Files to load after starting the application.")
@ -201,13 +209,18 @@ class CuraApplication(QtApplication):
for file in self.getCommandLineOption("file", []): for file in self.getCommandLineOption("file", []):
self._openFile(file) self._openFile(file)
for file_name in self._open_file_queue: #Open all the files that were queued up while plug-ins were loading.
self._openFile(file_name)
self.exec_() self.exec_()
# Handle Qt events # Handle Qt events
def event(self, event): def event(self, event):
if event.type() == QEvent.FileOpen: if event.type() == QEvent.FileOpen:
if self._plugins_loaded:
self._openFile(event.file()) self._openFile(event.file())
else:
self._open_file_queue.append(event.file())
return super().event(event) return super().event(event)
@ -268,7 +281,7 @@ class CuraApplication(QtApplication):
count += 1 count += 1
if not scene_boundingbox: if not scene_boundingbox:
scene_boundingbox = node.getBoundingBox() scene_boundingbox = copy.deepcopy(node.getBoundingBox())
else: else:
scene_boundingbox += node.getBoundingBox() scene_boundingbox += node.getBoundingBox()
@ -536,6 +549,7 @@ class CuraApplication(QtApplication):
group_decorator = GroupDecorator() group_decorator = GroupDecorator()
group_node.addDecorator(group_decorator) group_node.addDecorator(group_decorator)
group_node.setParent(self.getController().getScene().getRoot()) group_node.setParent(self.getController().getScene().getRoot())
group_node.setSelectable(True)
center = Selection.getSelectionCenter() center = Selection.getSelectionCenter()
group_node.setPosition(center) group_node.setPosition(center)
group_node.setCenterPosition(center) group_node.setCenterPosition(center)

View File

@ -174,32 +174,12 @@ class Polygon():
MoveRetractionType = 9 MoveRetractionType = 9
def __init__(self, mesh, type, data, line_width): def __init__(self, mesh, type, data, line_width):
super().__init__()
self._mesh = mesh self._mesh = mesh
self._type = type self._type = type
self._data = data self._data = data
self._line_width = line_width / 1000 self._line_width = line_width / 1000
if type == self.Inset0Type: self._color = self.__color_map[type]
self._color = Color(1.0, 0.0, 0.0, 1.0)
elif self._type == self.InsetXType:
self._color = Color(0.0, 1.0, 0.0, 1.0)
elif self._type == self.SkinType:
self._color = Color(1.0, 1.0, 0.0, 1.0)
elif self._type == self.SupportType:
self._color = Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.SkirtType:
self._color = Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.InfillType:
self._color = Color(1.0, 0.74, 0.0, 1.0)
elif self._type == self.SupportInfillType:
self._color = Color(0.0, 1.0, 1.0, 1.0)
elif self._type == self.MoveCombingType:
self._color = Color(0.0, 0.0, 1.0, 1.0)
elif self._type == self.MoveRetractionType:
self._color = Color(0.5, 0.5, 1.0, 1.0)
else:
self._color = Color(1.0, 1.0, 1.0, 1.0)
def build(self, offset, vertices, colors, indices): def build(self, offset, vertices, colors, indices):
self._begin = offset self._begin = offset
@ -260,3 +240,16 @@ class Polygon():
normals[:,2] /= lengths normals[:,2] /= lengths
return normals return normals
__color_map = {
NoneType: Color(1.0, 1.0, 1.0, 1.0),
Inset0Type: Color(1.0, 0.0, 0.0, 1.0),
InsetXType: Color(0.0, 1.0, 0.0, 1.0),
SkinType: Color(1.0, 1.0, 0.0, 1.0),
SupportType: Color(0.0, 1.0, 1.0, 1.0),
SkirtType: Color(0.0, 1.0, 1.0, 1.0),
InfillType: Color(1.0, 0.74, 0.0, 1.0),
SupportInfillType: Color(0.0, 1.0, 1.0, 1.0),
MoveCombingType: Color(0.0, 0.0, 1.0, 1.0),
MoveRetractionType: Color(0.5, 0.5, 1.0, 1.0),
}

View File

@ -30,10 +30,11 @@ class OneAtATimeIterator(Iterator.Iterator):
self._node_stack = node_list[:] self._node_stack = node_list[:]
return return
# Copy the list
self._original_node_list = node_list[:] self._original_node_list = node_list[:]
## Initialise the hit map (pre-compute all hits between all objects) ## Initialise the hit map (pre-compute all hits between all objects)
self._hit_map = [[self._checkHit(j,i) for i in node_list] for j in node_list] self._hit_map = [[self._checkHit(i,j) for i in node_list] for j in node_list]
# Check if we have to files that block eachother. If this is the case, there is no solution! # Check if we have to files that block eachother. If this is the case, there is no solution!
for a in range(0,len(node_list)): for a in range(0,len(node_list)):
@ -69,14 +70,16 @@ class OneAtATimeIterator(Iterator.Iterator):
def _checkHitMultiple(self, node, other_nodes): def _checkHitMultiple(self, node, other_nodes):
node_index = self._original_node_list.index(node) node_index = self._original_node_list.index(node)
for other_node in other_nodes: for other_node in other_nodes:
if self._hit_map[node_index][self._original_node_list.index(other_node)]: other_node_index = self._original_node_list.index(other_node)
if self._hit_map[node_index][other_node_index]:
return True return True
return False return False
def _checkBlockMultiple(self, node, other_nodes): def _checkBlockMultiple(self, node, other_nodes):
node_index = self._original_node_list.index(node) node_index = self._original_node_list.index(node)
for other_node in other_nodes: for other_node in other_nodes:
if self._hit_map[self._original_node_list.index(other_node)][node_index] and node_index != self._original_node_list.index(other_node): other_node_index = self._original_node_list.index(other_node)
if self._hit_map[other_node_index][node_index] and node_index != other_node_index:
return True return True
return False return False
@ -91,7 +94,7 @@ class OneAtATimeIterator(Iterator.Iterator):
if a == b: if a == b:
return False return False
overlap = a.callDecoration("getConvexHullBoundary").intersectsPolygon(b.callDecoration("getConvexHullHead")) overlap = a.callDecoration("getConvexHullBoundary").intersectsPolygon(b.callDecoration("getConvexHullHeadFull"))
if overlap: if overlap:
return True return True
else: else:

View File

@ -60,12 +60,16 @@ class PlatformPhysics:
build_volume_bounding_box = copy.deepcopy(self._build_volume.getBoundingBox()) build_volume_bounding_box = copy.deepcopy(self._build_volume.getBoundingBox())
build_volume_bounding_box.setBottom(-9001) # Ignore intersections with the bottom build_volume_bounding_box.setBottom(-9001) # Ignore intersections with the bottom
node._outside_buildarea = False
# Mark the node as outside the build volume if the bounding box test fails. # Mark the node as outside the build volume if the bounding box test fails.
if build_volume_bounding_box.intersectsBox(bbox) != AxisAlignedBox.IntersectionResult.FullIntersection: if build_volume_bounding_box.intersectsBox(bbox) != AxisAlignedBox.IntersectionResult.FullIntersection:
node._outside_buildarea = True node._outside_buildarea = True
else: else:
node._outside_buildarea = False # When printing one at a time too high objects are not printable.
if Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time":
if node.getBoundingBox().height > Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height"):
node._outside_buildarea = True
# Move it downwards if bottom is above platform # Move it downwards if bottom is above platform
move_vector = Vector() move_vector = Vector()

View File

@ -4,7 +4,6 @@
from PyQt5.QtCore import QObject, QDateTime, QTimer, pyqtSignal, pyqtSlot, pyqtProperty from PyQt5.QtCore import QObject, QDateTime, QTimer, pyqtSignal, pyqtSlot, pyqtProperty
from UM.Application import Application from UM.Application import Application
from UM.Settings.MachineSettings import MachineSettings
from UM.Resources import Resources from UM.Resources import Resources
from UM.Scene.SceneNode import SceneNode from UM.Scene.SceneNode import SceneNode
from UM.Qt.Duration import Duration from UM.Qt.Duration import Duration

View File

@ -6,7 +6,6 @@ class ZOffsetDecorator(SceneNodeDecorator):
self._z_offset = 0 self._z_offset = 0
def setZOffset(self, offset): def setZOffset(self, offset):
print("setZOffset", offset)
self._z_offset = offset self._z_offset = offset
def getZOffset(self): def getZOffset(self):

View File

@ -13,7 +13,6 @@ class AutoSave(Extension):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
#Preferences.getInstance().preferenceChanged.connect(self._onPreferenceChanged)
Preferences.getInstance().preferenceChanged.connect(self._triggerTimer) Preferences.getInstance().preferenceChanged.connect(self._triggerTimer)
machine_manager = Application.getInstance().getMachineManager() machine_manager = Application.getInstance().getMachineManager()
@ -52,8 +51,11 @@ class AutoSave(Extension):
self._saving = True # To prevent the save process from triggering another autosave. self._saving = True # To prevent the save process from triggering another autosave.
Logger.log("d", "Autosaving preferences, instances and profiles") Logger.log("d", "Autosaving preferences, instances and profiles")
machine_manager = Application.getInstance().getMachineManager()
machine_manager.saveVisibility()
machine_manager.saveMachineInstances()
machine_manager.saveProfiles()
Preferences.getInstance().writeToFile(Resources.getStoragePath(Resources.Preferences, Application.getInstance().getApplicationName() + ".cfg")) Preferences.getInstance().writeToFile(Resources.getStoragePath(Resources.Preferences, Application.getInstance().getApplicationName() + ".cfg"))
Application.getInstance().getMachineManager().saveMachineInstances()
Application.getInstance().getMachineManager().saveProfiles()
self._saving = False self._saving = False

View File

@ -26,6 +26,8 @@ import numpy
from PyQt5.QtCore import QTimer from PyQt5.QtCore import QTimer
import Arcus
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura") catalog = i18nCatalog("cura")
@ -73,6 +75,7 @@ class CuraEngineBackend(Backend):
self._restart = False self._restart = False
self._enabled = True self._enabled = True
self._always_restart = True self._always_restart = True
self._process_layers_job = None #The currently active job to process layers, or None if it is not processing layers.
self._message = None self._message = None
@ -120,6 +123,10 @@ class CuraEngineBackend(Backend):
self.slicingCancelled.emit() self.slicingCancelled.emit()
return return
if self._process_layers_job:
self._process_layers_job.abort()
self._process_layers_job = None
if self._profile.hasErrorValue(): if self._profile.hasErrorValue():
Logger.log("w", "Profile has error values. Aborting slicing") Logger.log("w", "Profile has error values. Aborting slicing")
if self._message: if self._message:
@ -179,6 +186,15 @@ class CuraEngineBackend(Backend):
self._onChanged() self._onChanged()
def _onSocketError(self, error):
super()._onSocketError(error)
self._slicing = False
self.processingProgress.emit(0)
if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]:
Logger.log("e", "A socket error caused the connection to be reset")
def _onActiveProfileChanged(self): def _onActiveProfileChanged(self):
if self._profile: if self._profile:
self._profile.settingValueChanged.disconnect(self._onSettingChanged) self._profile.settingValueChanged.disconnect(self._onSettingChanged)
@ -193,8 +209,8 @@ class CuraEngineBackend(Backend):
def _onSlicedObjectListMessage(self, message): def _onSlicedObjectListMessage(self, message):
if self._layer_view_active: if self._layer_view_active:
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message) self._process_layers_job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message)
job.start() self._process_layers_job.start()
else : else :
self._stored_layer_data = message self._stored_layer_data = message
@ -258,8 +274,8 @@ class CuraEngineBackend(Backend):
# There is data and we're not slicing at the moment # There is data and we're not slicing at the moment
# if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment.
if self._stored_layer_data and not self._slicing: if self._stored_layer_data and not self._slicing:
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(self._stored_layer_data) self._process_layers_job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(self._stored_layer_data)
job.start() self._process_layers_job.start()
self._stored_layer_data = None self._stored_layer_data = None
else: else:
self._layer_view_active = False self._layer_view_active = False

View File

@ -10,6 +10,8 @@ from UM.Mesh.MeshData import MeshData
from UM.Message import Message from UM.Message import Message
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
from UM.Math.Vector import Vector
from cura import LayerData from cura import LayerData
from cura import LayerDataDecorator from cura import LayerDataDecorator
@ -24,12 +26,26 @@ class ProcessSlicedObjectListJob(Job):
self._message = message self._message = message
self._scene = Application.getInstance().getController().getScene() self._scene = Application.getInstance().getController().getScene()
self._progress = None self._progress = None
self._abort_requested = False
## Aborts the processing of layers.
#
# This abort is made on a best-effort basis, meaning that the actual
# job thread will check once in a while to see whether an abort is
# requested and then stop processing by itself. There is no guarantee
# that the abort will stop the job any time soon or even at all.
def abort(self):
self._abort_requested = True
def run(self): def run(self):
if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView":
self._progress = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, -1) self._progress = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, -1)
self._progress.show() self._progress.show()
Job.yieldThread() Job.yieldThread()
if self._abort_requested:
if self._progress:
self._progress.hide()
return
Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged) Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged)
@ -43,15 +59,13 @@ class ProcessSlicedObjectListJob(Job):
else: else:
object_id_map[id(node)] = node object_id_map[id(node)] = node
Job.yieldThread() Job.yieldThread()
if self._abort_requested:
if self._progress:
self._progress.hide()
return
settings = Application.getInstance().getMachineManager().getWorkingProfile() settings = Application.getInstance().getMachineManager().getWorkingProfile()
center = None
if not settings.getSettingValue("machine_center_is_zero"):
center = numpy.array([settings.getSettingValue("machine_width") / 2, 0.0, -settings.getSettingValue("machine_depth") / 2])
else:
center = numpy.array([0.0, 0.0, 0.0])
mesh = MeshData() mesh = MeshData()
layer_data = LayerData.LayerData() layer_data = LayerData.LayerData()
@ -79,34 +93,50 @@ class ProcessSlicedObjectListJob(Job):
points = numpy.fromstring(polygon.points, dtype="i8") # Convert bytearray to numpy array points = numpy.fromstring(polygon.points, dtype="i8") # Convert bytearray to numpy array
points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
points = numpy.asarray(points, dtype=numpy.float32)
points /= 1000
points = numpy.insert(points, 1, (layer.height / 1000), axis = 1)
points[:,2] *= -1 # Create a new 3D-array, copy the 2D points over and insert the right height.
# This uses manual array creation + copy rather than numpy.insert since this is
# faster.
new_points = numpy.empty((len(points), 3), numpy.float32)
new_points[:,0] = points[:,0]
new_points[:,1] = layer.height
new_points[:,2] = -points[:,1]
points -= center new_points /= 1000
layer_data.addPolygon(layer.id, polygon.type, points, polygon.line_width)
layer_data.addPolygon(layer.id, polygon.type, new_points, polygon.line_width)
Job.yieldThread()
Job.yieldThread()
current_layer += 1 current_layer += 1
progress = (current_layer / layer_count) * 100 progress = (current_layer / layer_count) * 100
# TODO: Rebuild the layer data mesh once the layer has been processed. # TODO: Rebuild the layer data mesh once the layer has been processed.
# This needs some work in LayerData so we can add the new layers instead of recreating the entire mesh. # This needs some work in LayerData so we can add the new layers instead of recreating the entire mesh.
if self._abort_requested:
if self._progress:
self._progress.hide()
return
if self._progress: if self._progress:
self._progress.setProgress(progress) self._progress.setProgress(progress)
# We are done processing all the layers we got from the engine, now create a mesh out of the data # We are done processing all the layers we got from the engine, now create a mesh out of the data
layer_data.build() layer_data.build()
if self._abort_requested:
if self._progress:
self._progress.hide()
return
#Add layerdata decorator to scene node to indicate that the node has layerdata #Add layerdata decorator to scene node to indicate that the node has layerdata
decorator = LayerDataDecorator.LayerDataDecorator() decorator = LayerDataDecorator.LayerDataDecorator()
decorator.setLayerData(layer_data) decorator.setLayerData(layer_data)
new_node.addDecorator(decorator) new_node.addDecorator(decorator)
new_node.setMeshData(mesh) new_node.setMeshData(mesh)
new_node.setParent(self._scene.getRoot()) new_node.setParent(self._scene.getRoot()) #Note: After this we can no longer abort!
if not settings.getSettingValue("machine_center_is_zero"):
new_node.setPosition(Vector(-settings.getSettingValue("machine_width") / 2, 0.0, settings.getSettingValue("machine_depth") / 2))
if self._progress: if self._progress:
self._progress.setProgress(100) self._progress.setProgress(100)
@ -123,6 +153,7 @@ class ProcessSlicedObjectListJob(Job):
if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView":
if not self._progress: if not self._progress:
self._progress = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, 0) self._progress = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, 0)
if self._progress.getProgress() != 100:
self._progress.show() self._progress.show()
else: else:
if self._progress: if self._progress:

View File

@ -61,6 +61,8 @@ class StartSliceJob(Job):
if temp_list: if temp_list:
object_groups.append(temp_list) object_groups.append(temp_list)
Job.yieldThread() Job.yieldThread()
if len(object_groups) == 0:
Logger.log("w", "No objects suitable for one at a time found, or no correct order found")
else: else:
temp_list = [] temp_list = []
for node in DepthFirstIterator(self._scene.getRoot()): for node in DepthFirstIterator(self._scene.getRoot()):
@ -79,14 +81,16 @@ class StartSliceJob(Job):
self._sendSettings(self._profile) self._sendSettings(self._profile)
slice_message = self._socket.createMessage("cura.proto.Slice"); slice_message = self._socket.createMessage("cura.proto.Slice")
for group in object_groups: for group in object_groups:
group_message = slice_message.addRepeatedMessage("object_lists"); group_message = slice_message.addRepeatedMessage("object_lists")
if group[0].getParent().callDecoration("isGroup"):
self._handlePerObjectSettings(group[0].getParent(), group_message)
for object in group: for object in group:
mesh_data = object.getMeshData().getTransformed(object.getWorldTransformation()) mesh_data = object.getMeshData().getTransformed(object.getWorldTransformation())
obj = group_message.addRepeatedMessage("objects"); obj = group_message.addRepeatedMessage("objects")
obj.id = id(object) obj.id = id(object)
verts = numpy.array(mesh_data.getVertices()) verts = numpy.array(mesh_data.getVertices())
@ -142,7 +146,6 @@ class StartSliceJob(Job):
object_settings = node.callDecoration("getAllSettingValues") object_settings = node.callDecoration("getAllSettingValues")
if not object_settings: if not object_settings:
return return
for key, value in object_settings.items(): for key, value in object_settings.items():
setting = message.addRepeatedMessage("settings") setting = message.addRepeatedMessage("settings")
setting.name = key setting.name = key

View File

@ -4,6 +4,7 @@
from UM.Application import Application #To get the machine manager to create the new profile in. from UM.Application import Application #To get the machine manager to create the new profile in.
from UM.Settings.Profile import Profile from UM.Settings.Profile import Profile
from UM.Settings.ProfileReader import ProfileReader from UM.Settings.ProfileReader import ProfileReader
from UM.Logger import Logger
import re #Regular expressions for parsing escape characters in the settings. import re #Regular expressions for parsing escape characters in the settings.
## A class that reads profile data from g-code files. ## A class that reads profile data from g-code files.
@ -40,6 +41,9 @@ class GCodeProfileReader(ProfileReader):
# specified file was no g-code or contained no parsable profile, \code # specified file was no g-code or contained no parsable profile, \code
# None \endcode is returned. # None \endcode is returned.
def read(self, file_name): def read(self, file_name):
if file_name.split(".")[-1] != "gcode":
return None
prefix = ";SETTING_" + str(GCodeProfileReader.version) + " " prefix = ";SETTING_" + str(GCodeProfileReader.version) + " "
prefix_length = len(prefix) prefix_length = len(prefix)
@ -62,6 +66,10 @@ class GCodeProfileReader(ProfileReader):
profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False)
try: try:
profile.unserialise(serialised) profile.unserialise(serialised)
profile.setType(None) #Force type to none so it's correctly added.
profile.setReadOnly(False)
profile.setDirty(True)
except Exception as e: #Not a valid g-code file. except Exception as e: #Not a valid g-code file.
Logger.log("e", "Unable to serialise the profile: %s", str(e))
return None return None
return profile return profile

View File

@ -6,6 +6,7 @@ from UM.Logger import Logger
from UM.Application import Application from UM.Application import Application
import io import io
import re #For escaping characters in the settings. import re #For escaping characters in the settings.
import copy
class GCodeWriter(MeshWriter): class GCodeWriter(MeshWriter):
@ -57,7 +58,8 @@ class GCodeWriter(MeshWriter):
prefix = ";SETTING_" + str(GCodeWriter.version) + " " #The prefix to put before each line. prefix = ";SETTING_" + str(GCodeWriter.version) + " " #The prefix to put before each line.
prefix_length = len(prefix) prefix_length = len(prefix)
serialised = profile.serialise() #Serialise a deepcopy to remove the defaults from the profile
serialised = copy.deepcopy(profile).serialise()
#Escape characters that have a special meaning in g-code comments. #Escape characters that have a special meaning in g-code comments.
pattern = re.compile("|".join(GCodeWriter.escape_characters.keys())) pattern = re.compile("|".join(GCodeWriter.escape_characters.keys()))

View File

@ -33,8 +33,8 @@ class ImageReader(MeshReader):
depth = img.height() depth = img.height()
largest = max(width, depth) largest = max(width, depth)
width = width / largest * self._ui.defaultWidth width = width / largest * self._ui.default_width
depth = depth / largest * self._ui.defaultDepth depth = depth / largest * self._ui.default_depth
self._ui.setWidthAndDepth(width, depth) self._ui.setWidthAndDepth(width, depth)
self._ui.showConfigUI() self._ui.showConfigUI()
@ -112,7 +112,7 @@ class ImageReader(MeshReader):
height_data = 1 - height_data height_data = 1 - height_data
for i in range(0, blur_iterations): for i in range(0, blur_iterations):
copy = numpy.pad(height_data, ((1, 1), (1, 1)), mode='edge') copy = numpy.pad(height_data, ((1, 1), (1, 1)), mode= "edge")
height_data += copy[1:-1, 2:] height_data += copy[1:-1, 2:]
height_data += copy[1:-1, :-2] height_data += copy[1:-1, :-2]

View File

@ -24,12 +24,12 @@ class ImageReaderUI(QObject):
self._ui_view = None self._ui_view = None
self.show_config_ui_trigger.connect(self._actualShowConfigUI) self.show_config_ui_trigger.connect(self._actualShowConfigUI)
self.defaultWidth = 120 self.default_width = 120
self.defaultDepth = 120 self.default_depth = 120
self._aspect = 1 self._aspect = 1
self._width = self.defaultWidth self._width = self.default_width
self._depth = self.defaultDepth self._depth = self.default_depth
self.base_height = 1 self.base_height = 1
self.peak_height = 10 self.peak_height = 10

View File

@ -10,16 +10,23 @@ from UM.Signal import Signal
from UM.Scene.Selection import Selection from UM.Scene.Selection import Selection
from UM.Math.Color import Color from UM.Math.Color import Color
from UM.Mesh.MeshData import MeshData from UM.Mesh.MeshData import MeshData
from UM.Job import Job
from UM.Message import Message
from UM.View.RenderBatch import RenderBatch from UM.View.RenderBatch import RenderBatch
from UM.View.GL.OpenGL import OpenGL from UM.View.GL.OpenGL import OpenGL
from cura.ConvexHullNode import ConvexHullNode from cura.ConvexHullNode import ConvexHullNode
from PyQt5 import QtCore, QtWidgets from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication
from . import LayerViewProxy from . import LayerViewProxy
import time
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
## View used to display g-code paths. ## View used to display g-code paths.
class LayerView(View): class LayerView(View):
def __init__(self): def __init__(self):
@ -29,15 +36,23 @@ class LayerView(View):
self._num_layers = 0 self._num_layers = 0
self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100) self._layer_percentage = 0 # what percentage of layers need to be shown (SLider gives value between 0 - 100)
self._proxy = LayerViewProxy.LayerViewProxy() self._proxy = LayerViewProxy.LayerViewProxy()
self._controller.getScene().sceneChanged.connect(self._onSceneChanged) self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged)
self._max_layers = 10 self._max_layers = 10
self._current_layer_num = 10 self._current_layer_num = 10
self._current_layer_mesh = None self._current_layer_mesh = None
self._current_layer_jumps = None self._current_layer_jumps = None
self._top_layers_job = None
self._activity = False self._activity = False
self._solid_layers = 5 self._solid_layers = 5
self._top_layer_timer = QTimer()
self._top_layer_timer.setInterval(50)
self._top_layer_timer.setSingleShot(True)
self._top_layer_timer.timeout.connect(self._startUpdateTopLayers)
self._busy = False
def getActivity(self): def getActivity(self):
return self._activity return self._activity
@ -50,6 +65,16 @@ class LayerView(View):
def getMaxLayers(self): def getMaxLayers(self):
return self._max_layers return self._max_layers
busyChanged = Signal()
def isBusy(self):
return self._busy
def setBusy(self, busy):
if busy != self._busy:
self._busy = busy
self.busyChanged.emit()
def resetLayerData(self): def resetLayerData(self):
self._current_layer_mesh = None self._current_layer_mesh = None
self._current_layer_jumps = None self._current_layer_jumps = None
@ -89,50 +114,10 @@ class LayerView(View):
# This uses glDrawRangeElements internally to only draw a certain range of lines. # This uses glDrawRangeElements internally to only draw a certain range of lines.
renderer.queueNode(node, mesh = layer_data, mode = RenderBatch.RenderMode.Lines, range = (start, end)) renderer.queueNode(node, mesh = layer_data, mode = RenderBatch.RenderMode.Lines, range = (start, end))
# We currently recreate the current "solid" layers every time a
if not self._current_layer_mesh:
self._current_layer_mesh = MeshData()
for i in range(self._solid_layers):
layer = self._current_layer_num - i
if layer < 0:
continue
try:
layer_mesh = layer_data.getLayer(layer).createMesh()
if not layer_mesh or layer_mesh.getVertices() is None:
continue
except:
continue
if self._current_layer_mesh: #Threading thing; Switching between views can cause the current layer mesh to be deleted.
self._current_layer_mesh.addVertices(layer_mesh.getVertices())
# Scale layer color by a brightness factor based on the current layer number
# This will result in a range of 0.5 - 1.0 to multiply colors by.
brightness = (2.0 - (i / self._solid_layers)) / 2.0
if self._current_layer_mesh:
self._current_layer_mesh.addColors(layer_mesh.getColors() * brightness)
if self._current_layer_mesh: if self._current_layer_mesh:
renderer.queueNode(node, mesh = self._current_layer_mesh) renderer.queueNode(node, mesh = self._current_layer_mesh)
if not self._current_layer_jumps: if self._current_layer_jumps:
self._current_layer_jumps = MeshData()
for i in range(1):
layer = self._current_layer_num - i
if layer < 0:
continue
try:
layer_mesh = layer_data.getLayer(layer).createJumps()
if not layer_mesh or layer_mesh.getVertices() is None:
continue
except:
continue
self._current_layer_jumps.addVertices(layer_mesh.getVertices())
# Scale layer color by a brightness factor based on the current layer number
# This will result in a range of 0.5 - 1.0 to multiply colors by.
brightness = (2.0 - (i / self._solid_layers)) / 2.0
self._current_layer_jumps.addColors(layer_mesh.getColors() * brightness)
renderer.queueNode(node, mesh = self._current_layer_jumps) renderer.queueNode(node, mesh = self._current_layer_jumps)
def setLayer(self, value): def setLayer(self, value):
@ -145,6 +130,9 @@ class LayerView(View):
self._current_layer_mesh = None self._current_layer_mesh = None
self._current_layer_jumps = None self._current_layer_jumps = None
self._top_layer_timer.start()
self.currentLayerNumChanged.emit() self.currentLayerNumChanged.emit()
currentLayerNumChanged = Signal() currentLayerNumChanged = Signal()
@ -177,6 +165,7 @@ class LayerView(View):
else: else:
self.setLayer(int(self._max_layers)) self.setLayer(int(self._max_layers))
self.maxLayersChanged.emit() self.maxLayersChanged.emit()
self._top_layer_timer.start()
maxLayersChanged = Signal() maxLayersChanged = Signal()
currentLayerNumChanged = Signal() currentLayerNumChanged = Signal()
@ -190,8 +179,8 @@ class LayerView(View):
pass pass
def event(self, event): def event(self, event):
modifiers = QtWidgets.QApplication.keyboardModifiers() modifiers = QApplication.keyboardModifiers()
ctrl_is_active = modifiers == QtCore.Qt.ControlModifier ctrl_is_active = modifiers == Qt.ControlModifier
if event.type == Event.KeyPressEvent and ctrl_is_active: if event.type == Event.KeyPressEvent and ctrl_is_active:
if event.key == KeyEvent.UpKey: if event.key == KeyEvent.UpKey:
self.setLayer(self._current_layer_num + 1) self.setLayer(self._current_layer_num + 1)
@ -199,3 +188,86 @@ class LayerView(View):
if event.key == KeyEvent.DownKey: if event.key == KeyEvent.DownKey:
self.setLayer(self._current_layer_num - 1) self.setLayer(self._current_layer_num - 1)
return True return True
def _startUpdateTopLayers(self):
if self._top_layers_job:
self._top_layers_job.finished.disconnect(self._updateCurrentLayerMesh)
self._top_layers_job.cancel()
self.setBusy(True)
self._top_layers_job = _CreateTopLayersJob(self._controller.getScene(), self._current_layer_num, self._solid_layers)
self._top_layers_job.finished.connect(self._updateCurrentLayerMesh)
self._top_layers_job.start()
def _updateCurrentLayerMesh(self, job):
self.setBusy(False)
if not job.getResult():
return
self._current_layer_mesh = job.getResult().get("layers")
self._current_layer_jumps = job.getResult().get("jumps")
self._controller.getScene().sceneChanged.emit(self._controller.getScene().getRoot())
self._top_layers_job = None
class _CreateTopLayersJob(Job):
def __init__(self, scene, layer_number, solid_layers):
super().__init__()
self._scene = scene
self._layer_number = layer_number
self._solid_layers = solid_layers
self._cancel = False
def run(self):
layer_data = None
for node in DepthFirstIterator(self._scene.getRoot()):
layer_data = node.callDecoration("getLayerData")
if layer_data:
break
if self._cancel or not layer_data:
return
layer_mesh = MeshData()
for i in range(self._solid_layers):
layer_number = self._layer_number - i
if layer_number < 0:
continue
try:
layer = layer_data.getLayer(layer_number).createMesh()
except Exception as e:
print(e)
return
if not layer or layer.getVertices() is None:
continue
layer_mesh.addVertices(layer.getVertices())
# Scale layer color by a brightness factor based on the current layer number
# This will result in a range of 0.5 - 1.0 to multiply colors by.
brightness = (2.0 - (i / self._solid_layers)) / 2.0
layer_mesh.addColors(layer.getColors() * brightness)
if self._cancel:
return
Job.yieldThread()
if self._cancel:
return
Job.yieldThread()
jump_mesh = layer_data.getLayer(self._layer_number).createJumps()
if not jump_mesh or jump_mesh.getVertices() is None:
jump_mesh = None
self.setResult({ "layers": layer_mesh, "jumps": jump_mesh })
def cancel(self):
self._cancel = True
super().cancel()

View File

@ -10,35 +10,96 @@ import UM 1.0 as UM
Item Item
{ {
width: UM.Theme.sizes.button.width width: UM.Theme.getSize("button").width
height: UM.Theme.sizes.slider_layerview_size.height height: UM.Theme.getSize("slider_layerview_size").height
Slider Slider
{ {
id: slider id: slider
width: UM.Theme.sizes.slider_layerview_size.width width: UM.Theme.getSize("slider_layerview_size").width
height: UM.Theme.sizes.slider_layerview_size.height height: UM.Theme.getSize("slider_layerview_size").height
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.slider_layerview_margin.width/2 anchors.leftMargin: UM.Theme.getSize("slider_layerview_margin").width/2
orientation: Qt.Vertical orientation: Qt.Vertical
minimumValue: 0; minimumValue: 0;
maximumValue: UM.LayerView.numLayers; maximumValue: UM.LayerView.numLayers;
stepSize: 1 stepSize: 1
property real pixelsPerStep: ((height - UM.Theme.getSize("slider_handle").height) / (maximumValue - minimumValue)) * stepSize;
value: UM.LayerView.currentLayer value: UM.LayerView.currentLayer
onValueChanged: UM.LayerView.setCurrentLayer(value) onValueChanged: UM.LayerView.setCurrentLayer(value)
style: UM.Theme.styles.layerViewSlider style: UM.Theme.styles.slider;
Rectangle
{
x: parent.width + UM.Theme.getSize("slider_layerview_background").width / 2;
y: parent.height - (parent.value * parent.pixelsPerStep) - UM.Theme.getSize("slider_handle").height * 1.25;
height: UM.Theme.getSize("slider_handle").height + UM.Theme.getSize("default_margin").height
width: valueLabel.width + UM.Theme.getSize("default_margin").width
Behavior on height { NumberAnimation { duration: 50; } }
border.width: UM.Theme.getSize("default_lining").width;
border.color: UM.Theme.getColor("slider_groove_border");
visible: UM.LayerView.getLayerActivity && Printer.getPlatformActivity ? true : false
TextField
{
id: valueLabel
property string maxValue: slider.maximumValue + 1
text: slider.value + 1
horizontalAlignment: TextInput.AlignRight;
onEditingFinished:
{
if(valueLabel.text != '')
{
slider.value = valueLabel.text - 1
} }
}
validator: IntValidator { bottom: 1; top: slider.maximumValue + 1; }
anchors.left: parent.left;
anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2;
anchors.verticalCenter: parent.verticalCenter;
width: UM.Theme.getSize("line").width * maxValue.length;
style: TextFieldStyle
{
textColor: UM.Theme.getColor("setting_control_text");
font: UM.Theme.getFont("default");
background: Item { }
}
}
BusyIndicator
{
id: busyIndicator;
anchors.left: parent.right;
anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2;
anchors.verticalCenter: parent.verticalCenter;
width: UM.Theme.getSize("slider_handle").height;
height: width;
running: UM.LayerView.busy;
visible: UM.LayerView.busy;
}
}
}
Rectangle { Rectangle {
anchors.left: parent.left anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
z: slider.z - 1 z: slider.z - 1
width: UM.Theme.sizes.slider_layerview_background.width width: UM.Theme.getSize("slider_layerview_background").width
height: slider.height + UM.Theme.sizes.default_margin.height * 2 height: slider.height + UM.Theme.getSize("default_margin").height * 2
color: UM.Theme.colors.tool_panel_background; color: UM.Theme.getColor("tool_panel_background");
border.width: UM.Theme.sizes.default_lining.width border.width: UM.Theme.getSize("default_lining").width
border.color: UM.Theme.colors.lining border.color: UM.Theme.getColor("lining")
MouseArea { MouseArea {
id: sliderMouseArea id: sliderMouseArea

View File

@ -34,6 +34,15 @@ class LayerViewProxy(QObject):
if type(active_view) == LayerView.LayerView.LayerView: if type(active_view) == LayerView.LayerView.LayerView:
return active_view.getCurrentLayer() return active_view.getCurrentLayer()
busyChanged = pyqtSignal()
@pyqtProperty(bool, notify = busyChanged)
def busy(self):
active_view = self._controller.getActiveView()
if type(active_view) == LayerView.LayerView.LayerView:
return active_view.isBusy()
return False
@pyqtSlot(int) @pyqtSlot(int)
def setCurrentLayer(self, layer_num): def setCurrentLayer(self, layer_num):
active_view = self._controller.getActiveView() active_view = self._controller.getActiveView()
@ -50,8 +59,12 @@ class LayerViewProxy(QObject):
def _onMaxLayersChanged(self): def _onMaxLayersChanged(self):
self.maxLayersChanged.emit() self.maxLayersChanged.emit()
def _onBusyChanged(self):
self.busyChanged.emit()
def _onActiveViewChanged(self): def _onActiveViewChanged(self):
active_view = self._controller.getActiveView() active_view = self._controller.getActiveView()
if type(active_view) == LayerView.LayerView.LayerView: if type(active_view) == LayerView.LayerView.LayerView:
active_view.currentLayerNumChanged.connect(self._onLayerChanged) active_view.currentLayerNumChanged.connect(self._onLayerChanged)
active_view.maxLayersChanged.connect(self._onMaxLayersChanged) active_view.maxLayersChanged.connect(self._onMaxLayersChanged)
active_view.busyChanged.connect(self._onBusyChanged)

View File

@ -63,9 +63,10 @@ class LegacyProfileReader(ProfileReader):
# file could not be read or didn't contain a valid profile, \code None # file could not be read or didn't contain a valid profile, \code None
# \endcode is returned. # \endcode is returned.
def read(self, file_name): def read(self, file_name):
if file_name.split(".")[-1] != "ini":
return None
Logger.log("i", "Importing legacy profile from file " + file_name + ".") Logger.log("i", "Importing legacy profile from file " + file_name + ".")
profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) #Create an empty profile. profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) #Create an empty profile.
profile.setName("Imported Legacy Profile")
parser = configparser.ConfigParser(interpolation = None) parser = configparser.ConfigParser(interpolation = None)
try: try:
@ -123,5 +124,5 @@ class LegacyProfileReader(ProfileReader):
if len(profile.getChangedSettings()) == 0: if len(profile.getChangedSettings()) == 0:
Logger.log("i", "A legacy profile was imported but everything evaluates to the defaults, creating an empty profile.") Logger.log("i", "A legacy profile was imported but everything evaluates to the defaults, creating an empty profile.")
profile.setDirty(True)
return profile return profile

View File

@ -70,7 +70,7 @@ class PerObjectSettingsModel(ListModel):
def _updateModel(self): def _updateModel(self):
self.clear() self.clear()
for node in BreadthFirstIterator(self._root): for node in BreadthFirstIterator(self._root):
if type(node) is not SceneNode or not node.getMeshData() or not node.isSelectable(): if type(node) is not SceneNode or not node.isSelectable():
continue continue
node_profile = node.callDecoration("getProfile") node_profile = node.callDecoration("getProfile")
if not node_profile: if not node_profile:

View File

@ -22,34 +22,12 @@ Item {
anchors.top: parent.top; anchors.top: parent.top;
anchors.left: parent.left; anchors.left: parent.left;
spacing: UM.Theme.sizes.default_margin.height; spacing: UM.Theme.getSize("default_margin").height;
UM.SettingItem {
id: profileSelection
width: UM.Theme.sizes.setting.width;
height: UM.Theme.sizes.setting.height;
name: catalog.i18nc("@label", "Object profile")
type: "enum"
indent: false
style: UM.Theme.styles.setting_item;
options: UM.ProfilesModel { addUseGlobal: true }
value: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).profile
onItemValueChanged: {
var item = UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex);
UM.ActiveTool.properties.getValue("Model").setObjectProfile(item.id, value)
}
}
Column { Column {
id: customisedSettings id: customisedSettings
spacing: UM.Theme.sizes.default_lining.height; spacing: UM.Theme.getSize("default_lining").height;
width: UM.Theme.sizes.setting.width + UM.Theme.sizes.setting.height/2; width: UM.Theme.getSize("setting").width + UM.Theme.getSize("setting").height/2;
Repeater { Repeater {
id: settings; id: settings;
@ -57,8 +35,8 @@ Item {
model: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).settings model: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).settings
UM.SettingItem { UM.SettingItem {
width: UM.Theme.sizes.setting.width; width: UM.Theme.getSize("setting").width;
height: UM.Theme.sizes.setting.height; height: UM.Theme.getSize("setting").height;
name: model.label; name: model.label;
type: model.type; type: model.type;
@ -66,6 +44,7 @@ Item {
description: model.description; description: model.description;
unit: model.unit; unit: model.unit;
valid: model.valid; valid: model.valid;
visible: !model.global_only
options: model.options options: model.options
indent: false indent: false
@ -79,8 +58,8 @@ Item {
{ {
anchors.left: parent.right; anchors.left: parent.right;
width: UM.Theme.sizes.setting.height; width: UM.Theme.getSize("setting").height;
height: UM.Theme.sizes.setting.height; height: UM.Theme.getSize("setting").height;
onClicked: UM.ActiveTool.properties.getValue("Model").removeSettingOverride(UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id, model.key) onClicked: UM.ActiveTool.properties.getValue("Model").removeSettingOverride(UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id, model.key)
@ -97,8 +76,8 @@ Item {
height: parent.height/2 height: parent.height/2
sourceSize.width: width sourceSize.width: width
sourceSize.height: width sourceSize.height: width
color: control.hovered ? UM.Theme.colors.setting_control_button_hover : UM.Theme.colors.setting_control_button color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button")
source: UM.Theme.icons.cross1 source: UM.Theme.getIcon("cross1")
} }
} }
} }
@ -110,8 +89,7 @@ Item {
Button Button
{ {
id: customise_settings_button; id: customise_settings_button;
anchors.right: profileSelection.right; height: UM.Theme.getSize("setting").height;
height: UM.Theme.sizes.setting.height;
visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1 visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1
text: catalog.i18nc("@action:button", "Add Setting"); text: catalog.i18nc("@action:button", "Add Setting");
@ -122,16 +100,16 @@ Item {
{ {
width: control.width; width: control.width;
height: control.height; height: control.height;
border.width: UM.Theme.sizes.default_lining.width; border.width: UM.Theme.getSize("default_lining").width;
border.color: control.pressed ? UM.Theme.colors.action_button_active_border : border.color: control.pressed ? UM.Theme.getColor("action_button_active_border") :
control.hovered ? UM.Theme.colors.action_button_hovered_border : UM.Theme.colors.action_button_border control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
color: control.pressed ? UM.Theme.colors.action_button_active : color: control.pressed ? UM.Theme.getColor("action_button_active") :
control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
} }
label: Label label: Label
{ {
text: control.text; text: control.text;
color: UM.Theme.colors.setting_control_text; color: UM.Theme.getColor("setting_control_text");
anchors.centerIn: parent anchors.centerIn: parent
} }
} }
@ -180,7 +158,7 @@ Item {
} }
Column { Column {
width: view.width - UM.Theme.sizes.default_margin.width * 2; width: view.width - UM.Theme.getSize("default_margin").width * 2;
height: childrenRect.height; height: childrenRect.height;
Repeater { Repeater {
@ -211,11 +189,11 @@ Item {
} }
label: Row label: Row
{ {
spacing: UM.Theme.sizes.default_margin.width; spacing: UM.Theme.getSize("default_margin").width;
Image Image
{ {
anchors.verticalCenter: parent.verticalCenter; anchors.verticalCenter: parent.verticalCenter;
source: control.checked ? UM.Theme.icons.arrow_right : UM.Theme.icons.arrow_bottom; source: control.checked ? UM.Theme.getIcon("arrow_right") : UM.Theme.getIcon("arrow_bottom");
} }
Label Label
{ {
@ -259,7 +237,7 @@ Item {
delegate: ToolButton { delegate: ToolButton {
id: button; id: button;
x: model.depth * UM.Theme.sizes.default_margin.width; x: model.depth * UM.Theme.getSize("default_margin").width;
text: model.name; text: model.name;
tooltip: model.description; tooltip: model.description;
visible: !model.global_only visible: !model.global_only

View File

@ -5,6 +5,7 @@ from UM.Tool import Tool
from UM.Scene.Selection import Selection from UM.Scene.Selection import Selection
from UM.Application import Application from UM.Application import Application
from UM.Qt.ListModel import ListModel from UM.Qt.ListModel import ListModel
from UM.Preferences import Preferences
from . import PerObjectSettingsModel from . import PerObjectSettingsModel
@ -15,6 +16,9 @@ class PerObjectSettingsTool(Tool):
self.setExposedProperties("Model", "SelectedIndex") self.setExposedProperties("Model", "SelectedIndex")
Preferences.getInstance().preferenceChanged.connect(self._onPreferenceChanged)
self._onPreferenceChanged("cura/active_mode")
def event(self, event): def event(self, event):
return False return False
@ -27,6 +31,17 @@ class PerObjectSettingsTool(Tool):
return PerObjectSettingsModel.PerObjectSettingsModel(self._model) return PerObjectSettingsModel.PerObjectSettingsModel(self._model)
def getSelectedIndex(self): def getSelectedIndex(self):
selected_object_id = id(Selection.getSelectedObject(0)) try:
selected_object = Selection.getSelectedObject(0)
if selected_object.getParent().callDecoration("isGroup"):
selected_object = selected_object.getParent()
except:
selected_object = None
selected_object_id = id(selected_object)
index = self.getModel().find("id", selected_object_id) index = self.getModel().find("id", selected_object_id)
return index return index
def _onPreferenceChanged(self, preference):
if preference == "cura/active_mode":
enabled = Preferences.getInstance().getValue(preference)==1
Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, enabled)

View File

@ -18,6 +18,7 @@ class SettingOverrideModel(ListModel):
OptionsRole = Qt.UserRole + 8 OptionsRole = Qt.UserRole + 8
WarningDescriptionRole = Qt.UserRole + 9 WarningDescriptionRole = Qt.UserRole + 9
ErrorDescriptionRole = Qt.UserRole + 10 ErrorDescriptionRole = Qt.UserRole + 10
GlobalOnlyRole = Qt.UserRole + 11
def __init__(self, node, parent = None): def __init__(self, node, parent = None):
super().__init__(parent) super().__init__(parent)
@ -28,6 +29,10 @@ class SettingOverrideModel(ListModel):
self._node.decoratorsChanged.connect(self._onDecoratorsChanged) self._node.decoratorsChanged.connect(self._onDecoratorsChanged)
self._onDecoratorsChanged(None) self._onDecoratorsChanged(None)
self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes.
self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged)
Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged)
self.addRoleName(self.KeyRole, "key") self.addRoleName(self.KeyRole, "key")
self.addRoleName(self.LabelRole, "label") self.addRoleName(self.LabelRole, "label")
self.addRoleName(self.DescriptionRole, "description") self.addRoleName(self.DescriptionRole, "description")
@ -38,6 +43,7 @@ class SettingOverrideModel(ListModel):
self.addRoleName(self.OptionsRole, "options") self.addRoleName(self.OptionsRole, "options")
self.addRoleName(self.WarningDescriptionRole, "warning_description") self.addRoleName(self.WarningDescriptionRole, "warning_description")
self.addRoleName(self.ErrorDescriptionRole, "error_description") self.addRoleName(self.ErrorDescriptionRole, "error_description")
self.addRoleName(self.GlobalOnlyRole, "global_only")
@pyqtSlot(str, "QVariant") @pyqtSlot(str, "QVariant")
def setSettingValue(self, key, value): def setSettingValue(self, key, value):
@ -68,6 +74,35 @@ class SettingOverrideModel(ListModel):
model.appendItem({"value": str(value), "name": str(name)}) model.appendItem({"value": str(value), "name": str(name)})
return model return model
## Updates the active profile in this model if the active profile is
# changed.
#
# This links the settingValueChanged of the new profile to this model's
# _onSettingValueChanged function, so that it properly listens to those
# events again.
def _onProfileChanged(self):
if self._activeProfile: #Unlink from the old profile.
self._activeProfile.settingValueChanged.disconnect(self._onProfileSettingValueChanged)
old_profile = self._activeProfile
self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile()
self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged) #Re-link to the new profile.
for setting_name in old_profile.getChangedSettings().keys(): #Update all changed settings in the old and new profiles.
self._onProfileSettingValueChanged(setting_name)
for setting_name in self._activeProfile.getChangedSettings().keys():
self._onProfileSettingValueChanged(setting_name)
## Updates the global_only property of a setting once a setting value
# changes.
#
# This method should only get called on settings that are dependent on the
# changed setting.
#
# \param setting_name The setting that needs to be updated.
def _onProfileSettingValueChanged(self, setting_name):
index = self.find("key", setting_name)
if index != -1:
self.setProperty(index, "global_only", Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getSetting(setting_name).getGlobalOnly())
def _onSettingsChanged(self): def _onSettingsChanged(self):
self.clear() self.clear()
@ -84,7 +119,8 @@ class SettingOverrideModel(ListModel):
"valid": setting.validate(value), "valid": setting.validate(value),
"options": self._createOptionsModel(setting.getOptions()), "options": self._createOptionsModel(setting.getOptions()),
"warning_description": setting.getWarningDescription(), "warning_description": setting.getWarningDescription(),
"error_description": setting.getErrorDescription() "error_description": setting.getErrorDescription(),
"global_only": setting.getGlobalOnly()
}) })
items.sort(key = lambda i: i["key"]) items.sort(key = lambda i: i["key"])
@ -98,3 +134,4 @@ class SettingOverrideModel(ListModel):
if index != -1: if index != -1:
self.setProperty(index, "value", str(value)) self.setProperty(index, "value", str(value))
self.setProperty(index, "valid", setting.validate(value)) self.setProperty(index, "valid", setting.validate(value))
self.setProperty(index, "global_only", setting.getGlobalOnly())

View File

@ -33,14 +33,17 @@ class SolidView(View):
if not self._disabled_shader: if not self._disabled_shader:
self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "overhang.shader")) self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "overhang.shader"))
self._disabled_shader.setUniformValue("u_diffuseColor", [0.68, 0.68, 0.68, 1.0]) self._disabled_shader.setUniformValue("u_diffuseColor", [0.68, 0.68, 0.68, 1.0])
self._disabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0)))
if Application.getInstance().getMachineManager().getWorkingProfile(): if Application.getInstance().getMachineManager().getWorkingProfile():
profile = Application.getInstance().getMachineManager().getWorkingProfile() profile = Application.getInstance().getMachineManager().getWorkingProfile()
if profile.getSettingValue("support_enable") or not Preferences.getInstance().getValue("view/show_overhang"): if Preferences.getInstance().getValue("view/show_overhang"):
angle = profile.getSettingValue("support_angle") angle = profile.getSettingValue("support_angle")
if angle != None: if angle != None:
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle))) self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle)))
else:
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang.
else: else:
self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0)))

View File

@ -21,7 +21,7 @@ UM.Dialog
anchors.fill: parent; anchors.fill: parent;
Row Row
{ {
spacing: UM.Theme.sizes.default_margin.width; spacing: UM.Theme.getSize("default_margin").width;
Text Text
{ {
//: USB Printing dialog label, %1 is head temperature //: USB Printing dialog label, %1 is head temperature

View File

@ -54,10 +54,11 @@ UM.Dialog
ProgressBar ProgressBar
{ {
id: prog; id: prog
value: manager.progress value: manager.progress
minimumValue: 0; minimumValue: 0
maximumValue: 100; maximumValue: 100
indeterminate: manager.progress < 100
anchors anchors
{ {
left: parent.left; left: parent.left;

View File

@ -106,6 +106,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
try: try:
self._printer_connections[printer_connection].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName())) self._printer_connections[printer_connection].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName()))
except FileNotFoundError: except FileNotFoundError:
self._printer_connections[printer_connection].setProgress(100, 100)
Logger.log("w", "No firmware found for printer %s", printer_connection) Logger.log("w", "No firmware found for printer %s", printer_connection)
continue continue
@ -132,31 +133,38 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension):
return USBPrinterManager._instance return USBPrinterManager._instance
def _getDefaultFirmwareName(self): def _getDefaultFirmwareName(self):
machine_type = Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getId() machine_instance = Application.getInstance().getMachineManager().getActiveMachineInstance()
firmware_name = "" machine_type = machine_instance.getMachineDefinition().getId()
baudrate = 250000 baudrate = 250000
if sys.platform.startswith("linux"): if sys.platform.startswith("linux"):
baudrate = 115200 baudrate = 115200
if machine_type == "ultimaker_original": if machine_type == "ultimaker_original":
firmware_name = "MarlinUltimaker" firmware_name = "MarlinUltimaker"
if machine_instance.getMachineSettingValue("machine_heated_bed"): #Has heated bed upgrade kit?
firmware_name += "-HBK"
firmware_name += "-%d" % (baudrate) firmware_name += "-%d" % (baudrate)
return firmware_name + ".hex"
elif machine_type == "ultimaker_original_plus": elif machine_type == "ultimaker_original_plus":
firmware_name = "MarlinUltimaker-UMOP-%d" % (baudrate) firmware_name = "MarlinUltimaker-UMOP-%d" % (baudrate)
elif machine_type == "Witbox": return firmware_name + ".hex"
elif machine_type == "bq_witbox":
return "MarlinWitbox.hex" return "MarlinWitbox.hex"
elif machine_type == "ultimaker2go": elif machine_type == "ultimaker2_go":
return "MarlinUltimaker2go.hex" return "MarlinUltimaker2go.hex"
elif machine_type == "ultimaker2extended": elif machine_type == "ultimaker2_extended":
return "MarlinUltimaker2extended.hex" return "MarlinUltimaker2extended.hex"
elif machine_type == "ultimaker2": elif machine_type == "ultimaker2":
return "MarlinUltimaker2.hex" return "MarlinUltimaker2.hex"
elif machine_type == "ultimaker2plus":
return "MarlinUltimaker2plus.hex"
elif machine_type == "ultimaker2_extended_plus":
return "MarlinUltimaker2extended-plus.hex"
else:
Logger.log("e", "I don't know of any firmware for machine %s.", machine_type)
raise FileNotFoundError()
##TODO: Add check for multiple extruders ##TODO: Add check for multiple extruders
if firmware_name != "":
firmware_name += ".hex"
return firmware_name
def _addRemovePorts(self, serial_ports): def _addRemovePorts(self, serial_ports):
# First, find and add all new or changed keys # First, find and add all new or changed keys
for serial_port in list(serial_ports): for serial_port in list(serial_ports):

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,5 +1,5 @@
{ {
"id": "rigidbotbig", "id": "rigidbot",
"version": 1, "version": 1,
"name": "RigidBot", "name": "RigidBot",
"manufacturer": "Other", "manufacturer": "Other",
@ -8,7 +8,7 @@
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "machine_settings": {
"machine_width": { "default": 254 }, "machine_width": { "default": 254 },
"machine_depth": { "default": 254 }, "machine_depth": { "default": 254 },
@ -32,8 +32,10 @@
}, },
"machine_end_gcode": { "machine_end_gcode": {
"default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" "default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
}
}, },
"overrides": {
"layer_height": { "default": 0.2 }, "layer_height": { "default": 0.2 },
"shell_thickness": { "default": 0.8 }, "shell_thickness": { "default": 0.8 },
"wall_thickness": { "default": 0.8 }, "wall_thickness": { "default": 0.8 },
@ -49,7 +51,7 @@
"speed_infill": { "default": 100.0, "visible": true }, "speed_infill": { "default": 100.0, "visible": true },
"speed_topbottom": { "default": 15.0, "visible": true }, "speed_topbottom": { "default": 15.0, "visible": true },
"speed_travel": { "default": 150.0, "visible": true }, "speed_travel": { "default": 150.0, "visible": true },
"speed_layer_0": { "min_value": 0.1, "default": 15.0, "visible": true }, "speed_layer_0": { "min_value": "0.1", "default": 15.0, "visible": true },
"infill_overlap": { "default": 0.04, "inherit_function": "0.1 * line_width if infill_sparse_density < 95 else 0" }, "infill_overlap": { "default": 0.04, "inherit_function": "0.1 * line_width if infill_sparse_density < 95 else 0" },
"cool_fan_enabled": { "default": false, "visible": true }, "cool_fan_enabled": { "default": false, "visible": true },
"cool_fan_speed": { "default": 0.0, "visible": true }, "cool_fan_speed": { "default": 0.0, "visible": true },

View File

@ -8,7 +8,7 @@
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"overrides": { "machine_settings": {
"machine_width": { "default": 400 }, "machine_width": { "default": 400 },
"machine_depth": { "default": 300 }, "machine_depth": { "default": 300 },
@ -30,8 +30,10 @@
}, },
"machine_end_gcode": { "machine_end_gcode": {
"default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" "default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}"
}
}, },
"overrides": {
"layer_height": { "default": 0.2 }, "layer_height": { "default": 0.2 },
"shell_thickness": { "default": 0.8}, "shell_thickness": { "default": 0.8},
"wall_thickness": { "default": 0.8 }, "wall_thickness": { "default": 0.8 },
@ -47,8 +49,8 @@
"speed_infill": { "default": 100.0, "visible": true }, "speed_infill": { "default": 100.0, "visible": true },
"speed_topbottom": { "default": 15.0, "visible": true }, "speed_topbottom": { "default": 15.0, "visible": true },
"speed_travel": { "default": 150.0, "visible": true }, "speed_travel": { "default": 150.0, "visible": true },
"speed_layer_0": { "min_value": 0.1, "default": 15.0, "visible": true }, "speed_layer_0": { "min_value": "0.1", "default": 15.0, "visible": true },
"infill_overlap": { "default": 0.04, "inherit_function": "0.1 * line_width if infill_sparse_density < 95 else 0" }, "infill_overlap": { "default": 10.0 },
"cool_fan_enabled": { "default": false, "visible": true}, "cool_fan_enabled": { "default": false, "visible": true},
"cool_fan_speed": { "default": 0.0, "visible": true }, "cool_fan_speed": { "default": 0.0, "visible": true },
"skirt_line_count": { "default": 3, "active_if": { "setting": "adhesion_type", "value": "None" } }, "skirt_line_count": { "default": 3, "active_if": { "setting": "adhesion_type", "value": "None" } },

View File

@ -45,7 +45,8 @@
"max_value_warning": "150", "max_value_warning": "150",
"default": 60, "default": 60,
"visible": false, "visible": false,
"enabled": "prime_tower_enable" "enabled": "prime_tower_enable",
"global_only": true
} }
} }
}, },
@ -61,7 +62,8 @@
"default": 0.4, "default": 0.4,
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "prime_tower_enable" "enabled": "prime_tower_enable",
"global_only": true
} }
} }
} }
@ -88,7 +90,8 @@
"type": "int", "type": "int",
"default": 0, "default": 0,
"min_value": "0", "min_value": "0",
"max_value": "16" "max_value": "16",
"global_only": true
}, },
"support_extruder_nr": { "support_extruder_nr": {
"label": "Support Extruder", "label": "Support Extruder",
@ -97,6 +100,7 @@
"default": 0, "default": 0,
"min_value": "0", "min_value": "0",
"max_value": "16", "max_value": "16",
"global_only": true,
"children": { "children": {
"support_infill_extruder_nr": { "support_infill_extruder_nr": {
"label": "Support Infill Extruder", "label": "Support Infill Extruder",
@ -104,7 +108,8 @@
"type": "int", "type": "int",
"default": 0, "default": 0,
"min_value": "0", "min_value": "0",
"max_value": "16" "max_value": "16",
"global_only": true
}, },
"support_extruder_nr_layer_0": { "support_extruder_nr_layer_0": {
"label": "First Layer Support Extruder", "label": "First Layer Support Extruder",
@ -112,7 +117,8 @@
"type": "int", "type": "int",
"default": 0, "default": 0,
"min_value": "0", "min_value": "0",
"max_value": "16" "max_value": "16",
"global_only": true
}, },
"support_roof_extruder_nr": { "support_roof_extruder_nr": {
"label": "Support Roof Extruder", "label": "Support Roof Extruder",
@ -122,6 +128,7 @@
"min_value": "0", "min_value": "0",
"max_value": "16", "max_value": "16",
"enabled": "support_roof_enable" "enabled": "support_roof_enable"
"global_only": true
} }
} }
} }
@ -132,7 +139,8 @@
"description": "Print a tower next to the print which serves to prime the material after each nozzle switch.", "description": "Print a tower next to the print which serves to prime the material after each nozzle switch.",
"type": "boolean", "type": "boolean",
"visible": true, "visible": true,
"default": false "default": false,
"global_only": true
}, },
"prime_tower_size": { "prime_tower_size": {
"label": "Prime Tower Size", "label": "Prime Tower Size",
@ -144,7 +152,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "20", "max_value_warning": "20",
"inherit_function": "15 if prime_tower_enable else 0", "inherit_function": "15 if prime_tower_enable else 0",
"enabled": "prime_tower_enable" "enabled": "prime_tower_enable",
"global_only": true
}, },
"prime_tower_position_x": { "prime_tower_position_x": {
"label": "Prime Tower X Position", "label": "Prime Tower X Position",
@ -155,7 +164,8 @@
"default": 200, "default": 200,
"min_value_warning": "-1000", "min_value_warning": "-1000",
"max_value_warning": "1000", "max_value_warning": "1000",
"enabled": "prime_tower_enable" "enabled": "prime_tower_enable",
"global_only": true
}, },
"prime_tower_position_y": { "prime_tower_position_y": {
"label": "Prime Tower Y Position", "label": "Prime Tower Y Position",
@ -166,7 +176,8 @@
"default": 200, "default": 200,
"min_value_warning": "-1000", "min_value_warning": "-1000",
"max_value_warning": "1000", "max_value_warning": "1000",
"enabled": "prime_tower_enable" "enabled": "prime_tower_enable",
"global_only": true
}, },
"prime_tower_flow": { "prime_tower_flow": {
"label": "Prime Tower Flow", "label": "Prime Tower Flow",
@ -178,14 +189,16 @@
"min_value": "5", "min_value": "5",
"min_value_warning": "50", "min_value_warning": "50",
"max_value_warning": "150", "max_value_warning": "150",
"enabled": "prime_tower_enable" "enabled": "prime_tower_enable",
"global_only": true
}, },
"prime_tower_wipe_enabled": { "prime_tower_wipe_enabled": {
"label": "Wipe Nozzle on Prime tower", "label": "Wipe Nozzle on Prime tower",
"description": "After printing the prime tower with the one nozzle, wipe the oozed material from the other nozzle off on the prime tower.", "description": "After printing the prime tower with the one nozzle, wipe the oozed material from the other nozzle off on the prime tower.",
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"enabled": "prime_tower_enable" "enabled": "prime_tower_enable",
"global_only": true
}, },
"multiple_mesh_overlap": { "multiple_mesh_overlap": {
"label": "Dual Extrusion Overlap", "label": "Dual Extrusion Overlap",
@ -195,13 +208,15 @@
"unit": "mm", "unit": "mm",
"default": 0.15, "default": 0.15,
"min_value": "0", "min_value": "0",
"max_value_warning": "1.0" "max_value_warning": "1.0",
"global_only": true
}, },
"ooze_shield_enabled": { "ooze_shield_enabled": {
"label": "Enable Ooze Shield", "label": "Enable Ooze Shield",
"description": "Enable exterior ooze shield. This will create a shell around the object which is likely to wipe a second nozzle if it's at the same height as the first nozzle.", "description": "Enable exterior ooze shield. This will create a shell around the object which is likely to wipe a second nozzle if it's at the same height as the first nozzle.",
"type": "boolean", "type": "boolean",
"default": false "default": false,
"global_only": true
}, },
"ooze_shield_angle": { "ooze_shield_angle": {
"label": "Ooze Shield Angle", "label": "Ooze Shield Angle",
@ -212,7 +227,8 @@
"max_value": "90", "max_value": "90",
"default": 60, "default": 60,
"visible": false, "visible": false,
"enabled": "ooze_shield_enabled" "enabled": "ooze_shield_enabled",
"global_only": true
}, },
"ooze_shield_dist": { "ooze_shield_dist": {
"label": "Ooze Shields Distance", "label": "Ooze Shields Distance",
@ -223,12 +239,24 @@
"max_value_warning": "30", "max_value_warning": "30",
"default": 2, "default": 2,
"visible": false, "visible": false,
"enabled": "ooze_shield_enabled" "enabled": "ooze_shield_enabled",
"global_only": true
} }
} }
}, },
"material": { "material": {
"settings": { "settings": {
"material_standby_temperature": {
"label": "Standby Temperature",
"description": "The temperature of the nozzle when another nozzle is currently used for printing.",
"unit": "°C",
"type": "float",
"default": 150,
"min_value": "0",
"max_value_warning": "260",
"global_only": "True",
"visible": false
},
"switch_extruder_retraction_amount": { "switch_extruder_retraction_amount": {
"label": "Nozzle Switch Retraction Distance", "label": "Nozzle Switch Retraction Distance",
"description": "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone.", "description": "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone.",
@ -239,7 +267,8 @@
"max_value_warning": "100", "max_value_warning": "100",
"visible": false, "visible": false,
"inherit_function": "machine_heat_zone_length", "inherit_function": "machine_heat_zone_length",
"enabled": "retraction_enable" "enabled": "retraction_enable",
"global_only": true
}, },
"switch_extruder_retraction_speeds": { "switch_extruder_retraction_speeds": {
"label": "Nozzle Switch Retraction Speed", "label": "Nozzle Switch Retraction Speed",
@ -252,6 +281,7 @@
"visible": false, "visible": false,
"inherit": false, "inherit": false,
"enabled": "retraction_enable", "enabled": "retraction_enable",
"global_only": true,
"children": { "children": {
"switch_extruder_retraction_speed": { "switch_extruder_retraction_speed": {
"label": "Nozzle Switch Retract Speed", "label": "Nozzle Switch Retract Speed",
@ -262,7 +292,8 @@
"min_value": "0.1", "min_value": "0.1",
"max_value_warning": "300", "max_value_warning": "300",
"visible": false, "visible": false,
"enabled": "retraction_enable" "enabled": "retraction_enable",
"global_only": true
}, },
"switch_extruder_prime_speed": { "switch_extruder_prime_speed": {
"label": "Nozzle Switch Prime Speed", "label": "Nozzle Switch Prime Speed",
@ -273,7 +304,8 @@
"min_value": "0.1", "min_value": "0.1",
"max_value_warning": "300", "max_value_warning": "300",
"visible": false, "visible": false,
"enabled": "retraction_enable" "enabled": "retraction_enable",
"global_only": true
} }
} }
} }

View File

@ -182,7 +182,7 @@
"machine": { "machine": {
"label": "Machine", "label": "Machine",
"visible": true, "visible": true,
"icon": "category_layer_height", "icon": "category_machine",
"settings": { "settings": {
"machine_nozzle_size": { "machine_nozzle_size": {
"label": "Nozzle Diameter", "label": "Nozzle Diameter",
@ -210,8 +210,8 @@
"default": 0.1, "default": 0.1,
"min_value": "0.001", "min_value": "0.001",
"min_value_warning": "0.04", "min_value_warning": "0.04",
"max_value_warning": "0.32", "max_value_warning": "0.8 * machine_nozzle_size",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"layer_height_0": { "layer_height_0": {
"label": "Initial Layer Height", "label": "Initial Layer Height",
@ -221,9 +221,9 @@
"default": 0.3, "default": 0.3,
"min_value": "0.001", "min_value": "0.001",
"min_value_warning": "0.04", "min_value_warning": "0.04",
"max_value_warning": "0.32", "max_value_warning": "0.8 * machine_nozzle_size",
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"line_width": { "line_width": {
"label": "Line Width", "label": "Line Width",
@ -231,7 +231,7 @@
"unit": "mm", "unit": "mm",
"min_value": "0.0001", "min_value": "0.0001",
"min_value_warning": "0.2", "min_value_warning": "0.2",
"max_value_warning": "5", "max_value_warning": "2 * machine_nozzle_size",
"default": 0.4, "default": 0.4,
"type": "float", "type": "float",
"visible": false, "visible": false,
@ -281,7 +281,8 @@
"max_value_warning": "5", "max_value_warning": "5",
"default": 0.4, "default": 0.4,
"type": "float", "type": "float",
"visible": false "visible": false,
"global_only": true
}, },
"skin_line_width": { "skin_line_width": {
"label": "Top/bottom line width", "label": "Top/bottom line width",
@ -315,7 +316,8 @@
"default": 0.4, "default": 0.4,
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "support_enable" "enabled": "support_enable",
"global_only": true
}, },
"support_roof_line_width": { "support_roof_line_width": {
"label": "Support Roof line width", "label": "Support Roof line width",
@ -326,7 +328,8 @@
"max_value_warning": "machine_nozzle_size * 2", "max_value_warning": "machine_nozzle_size * 2",
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "support_roof_enable" "enabled": "support_roof_enable",
"global_only": true
} }
} }
} }
@ -346,6 +349,7 @@
"min_value": "0", "min_value": "0",
"min_value_warning": "0.2", "min_value_warning": "0.2",
"max_value_warning": "5", "max_value_warning": "5",
"visible": false,
"children": { "children": {
"wall_thickness": { "wall_thickness": {
"label": "Wall Thickness", "label": "Wall Thickness",
@ -356,7 +360,7 @@
"min_value_warning": "0.2", "min_value_warning": "0.2",
"max_value_warning": "5", "max_value_warning": "5",
"type": "float", "type": "float",
"visible": false, "visible": true,
"children": { "children": {
"wall_line_count": { "wall_line_count": {
"label": "Wall Line Count", "label": "Wall Line Count",
@ -365,7 +369,7 @@
"min_value": "0", "min_value": "0",
"type": "int", "type": "int",
"visible": false, "visible": false,
"inherit_function": "max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)" "inherit_function": "1 if magic_spiralize else max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)"
} }
} }
}, },
@ -386,7 +390,7 @@
"max_value": "5", "max_value": "5",
"min_value_warning": "0.6", "min_value_warning": "0.6",
"type": "float", "type": "float",
"visible": false, "visible": true,
"children": { "children": {
"top_thickness": { "top_thickness": {
"label": "Top Thickness", "label": "Top Thickness",
@ -463,7 +467,7 @@
"label": "Compensate Wall Overlaps", "label": "Compensate Wall Overlaps",
"description": "Compensate the flow for parts of a wall being laid down where there already is a piece of a wall. These overlaps occur in thin pieces in a model. Gcode generation might be slowed down considerably.", "description": "Compensate the flow for parts of a wall being laid down where there already is a piece of a wall. These overlaps occur in thin pieces in a model. Gcode generation might be slowed down considerably.",
"type": "boolean", "type": "boolean",
"default": false, "default": true,
"visible": false "visible": false
}, },
"fill_perimeter_gaps": { "fill_perimeter_gaps": {
@ -630,7 +634,9 @@
"description": "Change the temperature for each layer automatically with the average flow speed of that layer.", "description": "Change the temperature for each layer automatically with the average flow speed of that layer.",
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"visible": true "visible": false,
"enabled": "False",
"global_only": true
}, },
"material_print_temperature": { "material_print_temperature": {
"label": "Printing Temperature", "label": "Printing Temperature",
@ -648,7 +654,8 @@
"unit": "", "unit": "",
"type": "string", "type": "string",
"default": "[[3.5,200],[7.0,240]]", "default": "[[3.5,200],[7.0,240]]",
"enabled": "material_flow_dependent_temperature" "enabled": "material_flow_dependent_temperature",
"global_only": true
}, },
"material_standby_temperature": { "material_standby_temperature": {
"label": "Standby Temperature", "label": "Standby Temperature",
@ -658,7 +665,7 @@
"default": 150, "default": 150,
"min_value": "0", "min_value": "0",
"max_value_warning": "260", "max_value_warning": "260",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": true
}, },
"material_extrusion_cool_down_speed": { "material_extrusion_cool_down_speed": {
"label": "Extrusion Cool Down Speed Modifier", "label": "Extrusion Cool Down Speed Modifier",
@ -668,7 +675,9 @@
"default": 0.5, "default": 0.5,
"min_value": "0", "min_value": "0",
"max_value_warning": "10.0", "max_value_warning": "10.0",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True",
"enabled": "material_flow_dependent_temperature or machine_extruder_count > 1",
"visible": false
}, },
"material_bed_temperature": { "material_bed_temperature": {
"label": "Bed Temperature", "label": "Bed Temperature",
@ -679,7 +688,7 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "260", "max_value_warning": "260",
"enabled": "machine_heated_bed", "enabled": "machine_heated_bed",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"material_diameter": { "material_diameter": {
"label": "Diameter", "label": "Diameter",
@ -690,7 +699,7 @@
"min_value": "0.0001", "min_value": "0.0001",
"min_value_warning": "0.4", "min_value_warning": "0.4",
"max_value_warning": "3.5", "max_value_warning": "3.5",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"material_flow": { "material_flow": {
"label": "Flow", "label": "Flow",
@ -786,7 +795,7 @@
"description": "This setting limits the number of retractions occurring within the Minimum Extrusion Distance Window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues.", "description": "This setting limits the number of retractions occurring within the Minimum Extrusion Distance Window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues.",
"default": 8, "default": 8,
"min_value": "0", "min_value": "0",
"max_value_warning": "20", "max_value_warning": "100",
"type": "int", "type": "int",
"visible": false, "visible": false,
"inherit": false, "inherit": false,
@ -909,7 +918,8 @@
"max_value_warning": "150", "max_value_warning": "150",
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "support_roof_enable" "enabled": "support_roof_enable",
"global_only": true
}, },
"speed_support_roof": { "speed_support_roof": {
"label": "Support Roof Speed", "label": "Support Roof Speed",
@ -922,7 +932,8 @@
"visible": false, "visible": false,
"inherit": false, "inherit": false,
"enabled": "support_roof_enable", "enabled": "support_roof_enable",
"inherit_function": "parent_value / 60 * 40" "inherit_function": "parent_value / 60 * 40",
"global_only": true
} }
} }
} }
@ -936,7 +947,8 @@
"default": 120, "default": 120,
"min_value": "0.1", "min_value": "0.1",
"max_value_warning": "300", "max_value_warning": "300",
"inherit_function": "speed_print if magic_spiralize else 120" "inherit_function": "speed_print if magic_spiralize else 120",
"global_only": true
}, },
"speed_layer_0": { "speed_layer_0": {
"label": "Bottom Layer Speed", "label": "Bottom Layer Speed",
@ -957,7 +969,8 @@
"min_value": "0.1", "min_value": "0.1",
"max_value_warning": "300", "max_value_warning": "300",
"visible": false, "visible": false,
"inherit_function": "speed_layer_0" "inherit_function": "speed_layer_0",
"global_only": true
}, },
"speed_slowdown_layers": { "speed_slowdown_layers": {
"label": "Number of Slower Layers", "label": "Number of Slower Layers",
@ -966,7 +979,8 @@
"default": 4, "default": 4,
"min_value": "0", "min_value": "0",
"max_value_warning": "300", "max_value_warning": "300",
"visible": false "visible": false,
"global_only": true
} }
} }
}, },
@ -980,7 +994,8 @@
"description": "Combing keeps the head within the interior of the print whenever possible when traveling from one part of the print to another and does not use retraction. If combing is disabled, the print head moves straight from the start point to the end point and it will always retract.", "description": "Combing keeps the head within the interior of the print whenever possible when traveling from one part of the print to another and does not use retraction. If combing is disabled, the print head moves straight from the start point to the end point and it will always retract.",
"type": "boolean", "type": "boolean",
"default": true, "default": true,
"visible": false "visible": false,
"global_only": true
}, },
"travel_avoid_other_parts": { "travel_avoid_other_parts": {
"label": "Avoid Printed Parts", "label": "Avoid Printed Parts",
@ -989,7 +1004,7 @@
"default": true, "default": true,
"visible": false, "visible": false,
"enabled": "retraction_combing", "enabled": "retraction_combing",
"global_only": "print_sequence != \"one_at_a_time\"", "global_only": "True",
"children": { "children": {
"travel_avoid_distance": { "travel_avoid_distance": {
"label": "Avoid Distance", "label": "Avoid Distance",
@ -1002,7 +1017,7 @@
"visible": false, "visible": false,
"inherit": false, "inherit": false,
"enabled": "retraction_combing", "enabled": "retraction_combing",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
} }
} }
}, },
@ -1011,7 +1026,8 @@
"description": "Coasting replaces the last part of an extrusion path with a travel path. The oozed material is used to lay down the last piece of the extrusion path in order to reduce stringing.", "description": "Coasting replaces the last part of an extrusion path with a travel path. The oozed material is used to lay down the last piece of the extrusion path in order to reduce stringing.",
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"visible": true "visible": false,
"global_only": true
}, },
"coasting_volume": { "coasting_volume": {
"label": "Coasting Volume", "label": "Coasting Volume",
@ -1023,7 +1039,8 @@
"max_value_warning": "2.0", "max_value_warning": "2.0",
"visible": false, "visible": false,
"inherit": false, "inherit": false,
"enabled": "coasting_enable" "enabled": "coasting_enable",
"global_only": true
}, },
"coasting_min_volume": { "coasting_min_volume": {
"label": "Minimal Volume Before Coasting", "label": "Minimal Volume Before Coasting",
@ -1034,7 +1051,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "10.0", "max_value_warning": "10.0",
"visible": false, "visible": false,
"enabled": "coasting_enable" "enabled": "coasting_enable",
"global_only": true
}, },
"coasting_speed": { "coasting_speed": {
"label": "Coasting Speed", "label": "Coasting Speed",
@ -1046,7 +1064,8 @@
"max_value_warning": "100", "max_value_warning": "100",
"visible": false, "visible": false,
"inherit": false, "inherit": false,
"enabled": "coasting_enable" "enabled": "coasting_enable",
"global_only": true
} }
} }
}, },
@ -1060,7 +1079,7 @@
"description": "Enable the cooling fan during the print. The extra cooling from the cooling fan helps parts with small cross sections that print each layer quickly.", "description": "Enable the cooling fan during the print. The extra cooling from the cooling fan helps parts with small cross sections that print each layer quickly.",
"type": "boolean", "type": "boolean",
"default": true, "default": true,
"global_only": "print_sequence != \"one_at_a_time\"", "global_only": "True",
"children": { "children": {
"cool_fan_speed": { "cool_fan_speed": {
"label": "Fan Speed", "label": "Fan Speed",
@ -1072,11 +1091,11 @@
"default": 100, "default": 100,
"visible": false, "visible": false,
"inherit_function": "100.0 if parent_value else 0.0", "inherit_function": "100.0 if parent_value else 0.0",
"global_only": "print_sequence != \"one_at_a_time\"", "global_only": "True",
"children": { "children": {
"cool_fan_speed_min": { "cool_fan_speed_min": {
"label": "Normal Fan Speed", "label": "Minimum Fan Speed",
"description": "Normally the fan runs at the minimum fan speed. If a layer takes less than Shortest Layer Time Normal Fan Speed, the fan speed adjusts from Normal Fan Speed towards Maximum Fan Speed.", "description": "Normally the fan runs at the minimum fan speed. If the layer is slowed down due to minimum layer time, the fan speed adjusts between minimum and maximum fan speed.",
"unit": "%", "unit": "%",
"type": "float", "type": "float",
"min_value": "0", "min_value": "0",
@ -1084,11 +1103,11 @@
"inherit_function": "parent_value", "inherit_function": "parent_value",
"default": 100, "default": 100,
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"cool_fan_speed_max": { "cool_fan_speed_max": {
"label": "Maximum Fan Speed", "label": "Maximum Fan Speed",
"description": "If a layer is slowed down due to minimum layer time, the fan speed will be the Maximum Fan Speed.", "description": "Normally the fan runs at the minimum fan speed. If the layer is slowed down due to minimum layer time, the fan speed adjusts between minimum and maximum fan speed.",
"unit": "%", "unit": "%",
"type": "float", "type": "float",
"min_value": "max(0, cool_fan_speed_min)", "min_value": "max(0, cool_fan_speed_min)",
@ -1096,33 +1115,33 @@
"inherit": false, "inherit": false,
"default": 100, "default": 100,
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
} }
} }
} }
} }
}, },
"cool_fan_full_at_height": { "cool_fan_full_at_height": {
"label": "Slow Fan Down Below Height", "label": "Fan Full on at Height",
"description": "The height at which the fan is set to Normal Fan Speed. For the layers below this the fan speed is scaled linearly with the fan off on the first layer.", "description": "The height at which the fan is turned on completely. For the layers below this the fan speed is scaled linearly with the fan off for the first layer.",
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default": 0.5, "default": 0.5,
"min_value": "0", "min_value": "0",
"max_value_warning": "10.0", "max_value_warning": "10.0",
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"", "global_only": "True",
"children": { "children": {
"cool_fan_full_layer": { "cool_fan_full_layer": {
"label": "Slow Fan Down Below Layer", "label": "Fan Full on at Layer",
"description": "The layer number at which the fan is set to Normal Fan Speed. For the layers below this the fan speed is scaled linearly with the fan off on the first layer.", "description": "The layer number at which the fan is turned on completely. For the layers below this the fan speed is scaled linearly with the fan off for the first layer.",
"type": "int", "type": "int",
"default": 4, "default": 4,
"min_value": "0", "min_value": "0",
"max_value_warning": "100", "max_value_warning": "100",
"visible": false, "visible": false,
"inherit_function": "int((parent_value - layer_height_0 + 0.001) / layer_height)", "inherit_function": "int((parent_value - layer_height_0 + 0.001) / layer_height)",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
} }
} }
}, },
@ -1135,18 +1154,18 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "600", "max_value_warning": "600",
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"cool_min_layer_time_fan_speed_max": { "cool_min_layer_time_fan_speed_max": {
"label": "Shortest Layer Time Normal Fan Speed", "label": "Minimum Layer Time Full Fan Speed",
"description": "The minimum time spent in a layer which will cause the fan to be at normal speed. All layers taking shorter than this time will get increased fan speeds, up to Maximum Fan Speed for layers taking Minmal Layer Time. All layers taking longer than this time will have Normal Fan Speed.", "description": "The minimum time spent in a layer which will cause the fan to be at maximum speed. The fan speed increases linearly from minimum fan speed for layers taking the minimum layer time to maximum fan speed for layers taking the time specified here.",
"unit": "sec", "unit": "sec",
"type": "float", "type": "float",
"default": 10, "default": 10,
"min_value": "cool_min_layer_time", "min_value": "cool_min_layer_time",
"max_value_warning": "600", "max_value_warning": "600",
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"cool_min_speed": { "cool_min_speed": {
"label": "Minimum Speed", "label": "Minimum Speed",
@ -1157,7 +1176,7 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "100", "max_value_warning": "100",
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"cool_lift_head": { "cool_lift_head": {
"label": "Lift Head", "label": "Lift Head",
@ -1165,13 +1184,14 @@
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"draft_shield_enabled": { "draft_shield_enabled": {
"label": "Enable Draft Shield", "label": "Enable Draft Shield",
"description": "Enable exterior draft shield. This will create a wall around the object which traps (hot) air and shields against gusts of wind. Especially useful for materials which warp easily.", "description": "Enable exterior draft shield. This will create a wall around the object which traps (hot) air and shields against gusts of wind. Especially useful for materials which warp easily.",
"type": "boolean", "type": "boolean",
"default": false "default": false,
"global_only": true
}, },
"draft_shield_dist": { "draft_shield_dist": {
"label": "Draft Shield X/Y Distance", "label": "Draft Shield X/Y Distance",
@ -1182,7 +1202,8 @@
"max_value_warning": "100", "max_value_warning": "100",
"default": 10, "default": 10,
"visible": false, "visible": false,
"enabled": "draft_shield_enabled" "enabled": "draft_shield_enabled",
"global_only": true
}, },
"draft_shield_height_limitation": { "draft_shield_height_limitation": {
"label": "Draft Shield Limitation", "label": "Draft Shield Limitation",
@ -1194,7 +1215,8 @@
}, },
"default": "full", "default": "full",
"visible": false, "visible": false,
"enabled": "draft_shield_enabled" "enabled": "draft_shield_enabled",
"global_only": true
}, },
"draft_shield_height": { "draft_shield_height": {
"label": "Draft Shield Height", "label": "Draft Shield Height",
@ -1206,7 +1228,8 @@
"default": 0, "default": 0,
"inherit_function": "9999 if draft_shield_height_limitation == 'full' and draft_shield_enabled else 0.0", "inherit_function": "9999 if draft_shield_height_limitation == 'full' and draft_shield_enabled else 0.0",
"visible": false, "visible": false,
"enabled": "draft_shield_height_limitation == \"limited\"" "enabled": "draft_shield_height_limitation == \"limited\"",
"global_only": true
} }
} }
}, },
@ -1219,7 +1242,7 @@
"label": "Enable Support", "label": "Enable Support",
"description": "Enable exterior support structures. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air.", "description": "Enable exterior support structures. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air.",
"type": "boolean", "type": "boolean",
"default": true "default": false
}, },
"support_type": { "support_type": {
"label": "Placement", "label": "Placement",
@ -1239,7 +1262,7 @@
"type": "float", "type": "float",
"min_value": "0", "min_value": "0",
"max_value": "90", "max_value": "90",
"default": 60, "default": 50,
"visible": false, "visible": false,
"enabled": "support_enable" "enabled": "support_enable"
}, },
@ -1304,6 +1327,8 @@
"unit": "°", "unit": "°",
"type": "float", "type": "float",
"min_value": "-90", "min_value": "-90",
"min_value_warning": "-45",
"max_value_warning": "45",
"max_value": "90", "max_value": "90",
"default": 30, "default": 30,
"visible": false, "visible": false,
@ -1393,6 +1418,7 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "100", "max_value_warning": "100",
"enabled":"support_roof_enable", "enabled":"support_roof_enable",
"global_only": true,
"children": { "children": {
"support_roof_line_distance": { "support_roof_line_distance": {
"label": "Support Roof Line Distance", "label": "Support Roof Line Distance",
@ -1403,7 +1429,8 @@
"min_value": "0", "min_value": "0",
"visible": false, "visible": false,
"inherit_function": "0 if parent_value == 0 else (support_roof_line_width * 100) / parent_value", "inherit_function": "0 if parent_value == 0 else (support_roof_line_width * 100) / parent_value",
"enabled": "support_roof_enable" "enabled": "support_roof_enable",
"global_only": true
} }
} }
}, },
@ -1420,7 +1447,8 @@
"zigzag": "Zig Zag" "zigzag": "Zig Zag"
}, },
"default": "concentric", "default": "concentric",
"enabled": "support_roof_enable" "enabled": "support_roof_enable",
"global_only": true
}, },
"support_use_towers": { "support_use_towers": {
"label": "Use towers", "label": "Use towers",
@ -1446,12 +1474,27 @@
"description": "The diameter of a special tower.", "description": "The diameter of a special tower.",
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default": 1, "default": 3.0,
"min_value": "0", "min_value": "0",
"min_value_warning": "support_minimal_diameter", "min_value_warning": "support_minimal_diameter",
"max_value_warning": "10", "max_value_warning": "10",
"visible": false, "visible": false,
"enabled": "support_enable" "enabled": "support_enable and support_use_towers",
"children": {
"support_minimal_diameter": {
"label": "Minimum Diameter",
"description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.",
"unit": "mm",
"type": "float",
"default": 3.0,
"min_value": "0",
"max_value_warning": "10",
"max_value": "support_tower_diameter",
"inherit": true,
"visible": false,
"enabled": "support_enable and support_use_towers"
}
}
}, },
"support_tower_roof_angle": { "support_tower_roof_angle": {
"label": "Tower Roof Angle", "label": "Tower Roof Angle",
@ -1477,7 +1520,8 @@
}, },
"default": "zigzag", "default": "zigzag",
"visible": false, "visible": false,
"enabled": "support_enable" "enabled": "support_enable",
"global_only": true
}, },
"support_connect_zigzags": { "support_connect_zigzags": {
"label": "Connect ZigZags", "label": "Connect ZigZags",
@ -1485,7 +1529,8 @@
"type": "boolean", "type": "boolean",
"default": true, "default": true,
"visible": false, "visible": false,
"enabled": "support_enable" "enabled": "support_enable",
"global_only": true
}, },
"support_infill_rate": { "support_infill_rate": {
"label": "Fill Amount", "label": "Fill Amount",
@ -1497,7 +1542,7 @@
"default": 15, "default": 15,
"visible": false, "visible": false,
"enabled": "support_enable", "enabled": "support_enable",
"global_only": true,
"children": { "children": {
"support_line_distance": { "support_line_distance": {
"label": "Line distance", "label": "Line distance",
@ -1508,7 +1553,8 @@
"default": 2.66, "default": 2.66,
"visible": false, "visible": false,
"enabled": "support_enable", "enabled": "support_enable",
"inherit_function": "(support_line_width * 100) / parent_value" "inherit_function": "(support_line_width * 100) / parent_value",
"global_only": true
} }
} }
} }
@ -1528,7 +1574,8 @@
"brim": "Brim", "brim": "Brim",
"raft": "Raft" "raft": "Raft"
}, },
"default": "skirt" "default": "skirt",
"global_only": "True"
}, },
"skirt_line_count": { "skirt_line_count": {
"label": "Skirt Line Count", "label": "Skirt Line Count",
@ -1538,7 +1585,8 @@
"min_value": "0", "min_value": "0",
"max_value_warning": "10", "max_value_warning": "10",
"enabled": "adhesion_type == \"skirt\"", "enabled": "adhesion_type == \"skirt\"",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True",
"visible": false
}, },
"skirt_gap": { "skirt_gap": {
"label": "Skirt Distance", "label": "Skirt Distance",
@ -1549,7 +1597,8 @@
"min_value_warning": "0", "min_value_warning": "0",
"max_value_warning": "100", "max_value_warning": "100",
"enabled": "adhesion_type == \"skirt\"", "enabled": "adhesion_type == \"skirt\"",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True",
"visible": false
}, },
"skirt_minimal_length": { "skirt_minimal_length": {
"label": "Skirt Minimum Length", "label": "Skirt Minimum Length",
@ -1561,29 +1610,32 @@
"min_value_warning": "25", "min_value_warning": "25",
"max_value_warning": "2500", "max_value_warning": "2500",
"enabled": "adhesion_type == \"skirt\"", "enabled": "adhesion_type == \"skirt\"",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True",
"visible": false
}, },
"brim_width": { "brim_width": {
"label": "Brim Width", "label": "Brim Width",
"description": "The distance from the model to the end of the brim. A larger brim sticks better to the build platform, but also makes your effective print area smaller.", "description": "The distance from the model to the end of the brim. A larger brim sticks better to the build platform, but also makes your effective print area smaller.",
"type": "float", "type": "float",
"unit": "mm", "unit": "mm",
"default": 5.0, "default": 8.0,
"min_value": "0.0", "min_value": "0.0",
"max_value_warning": "100.0", "max_value_warning": "100.0",
"enabled": "adhesion_type == \"brim\"", "enabled": "adhesion_type == \"brim\"",
"global_only": "print_sequence != \"one_at_a_time\"", "global_only": "True",
"visible": true,
"children": { "children": {
"brim_line_count": { "brim_line_count": {
"label": "Brim Line Count", "label": "Brim Line Count",
"description": "The number of lines used for a brim. More lines means a larger brim which sticks better to the build plate, but this also makes your effective print area smaller.", "description": "The number of lines used for a brim. More lines means a larger brim which sticks better to the build plate, but this also makes your effective print area smaller.",
"type": "int", "type": "int",
"default": 13, "default": 20,
"min_value": "0", "min_value": "0",
"max_value_warning": "300", "max_value_warning": "300",
"inherit_function": "math.ceil(parent_value / skirt_line_width)", "inherit_function": "math.ceil(parent_value / skirt_line_width)",
"enabled": "adhesion_type == \"brim\"", "enabled": "adhesion_type == \"brim\"",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True",
"visible": false
} }
} }
}, },
@ -1595,7 +1647,9 @@
"default": 5, "default": 5,
"min_value_warning": "0", "min_value_warning": "0",
"max_value_warning": "10", "max_value_warning": "10",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_airgap": { "raft_airgap": {
"label": "Raft Air-gap", "label": "Raft Air-gap",
@ -1605,7 +1659,9 @@
"default": 0.35, "default": 0.35,
"min_value": "0", "min_value": "0",
"max_value_warning": "1.0", "max_value_warning": "1.0",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": true
}, },
"raft_surface_layers": { "raft_surface_layers": {
"label": "Raft Top Layers", "label": "Raft Top Layers",
@ -1614,7 +1670,9 @@
"default": 2, "default": 2,
"min_value": "0", "min_value": "0",
"max_value_warning": "20", "max_value_warning": "20",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": true
}, },
"raft_surface_thickness": { "raft_surface_thickness": {
"label": "Raft Top Layer Thickness", "label": "Raft Top Layer Thickness",
@ -1624,7 +1682,9 @@
"default": 0.1, "default": 0.1,
"min_value": "0", "min_value": "0",
"max_value_warning": "2.0", "max_value_warning": "2.0",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_surface_line_width": { "raft_surface_line_width": {
"label": "Raft Top Line Width", "label": "Raft Top Line Width",
@ -1634,7 +1694,9 @@
"default": 0.3, "default": 0.3,
"min_value": "0.0001", "min_value": "0.0001",
"max_value_warning": "machine_nozzle_size * 2", "max_value_warning": "machine_nozzle_size * 2",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_surface_line_spacing": { "raft_surface_line_spacing": {
"label": "Raft Top Spacing", "label": "Raft Top Spacing",
@ -1645,7 +1707,9 @@
"min_value": "0.0001", "min_value": "0.0001",
"max_value_warning": "5.0", "max_value_warning": "5.0",
"enabled": "adhesion_type == \"raft\"", "enabled": "adhesion_type == \"raft\"",
"inherit_function": "raft_surface_line_width" "inherit_function": "raft_surface_line_width",
"global_only": "True",
"visible": false
}, },
"raft_interface_thickness": { "raft_interface_thickness": {
"label": "Raft Middle Thickness", "label": "Raft Middle Thickness",
@ -1655,7 +1719,9 @@
"default": 0.27, "default": 0.27,
"min_value": "0", "min_value": "0",
"max_value_warning": "5.0", "max_value_warning": "5.0",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_interface_line_width": { "raft_interface_line_width": {
"label": "Raft Middle Line Width", "label": "Raft Middle Line Width",
@ -1665,7 +1731,9 @@
"default": 1, "default": 1,
"min_value": "0.0001", "min_value": "0.0001",
"max_value_warning": "machine_nozzle_size * 2", "max_value_warning": "machine_nozzle_size * 2",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_interface_line_spacing": { "raft_interface_line_spacing": {
"label": "Raft Middle Spacing", "label": "Raft Middle Spacing",
@ -1675,7 +1743,9 @@
"default": 1.0, "default": 1.0,
"min_value": "0", "min_value": "0",
"max_value_warning": "15.0", "max_value_warning": "15.0",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_base_thickness": { "raft_base_thickness": {
"label": "Raft Base Thickness", "label": "Raft Base Thickness",
@ -1685,7 +1755,9 @@
"default": 0.3, "default": 0.3,
"min_value": "0", "min_value": "0",
"max_value_warning": "5.0", "max_value_warning": "5.0",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_base_line_width": { "raft_base_line_width": {
"label": "Raft Base Line Width", "label": "Raft Base Line Width",
@ -1695,7 +1767,9 @@
"default": 1, "default": 1,
"min_value": "0.0001", "min_value": "0.0001",
"max_value_warning": "machine_nozzle_size * 2", "max_value_warning": "machine_nozzle_size * 2",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_base_line_spacing": { "raft_base_line_spacing": {
"label": "Raft Line Spacing", "label": "Raft Line Spacing",
@ -1705,7 +1779,9 @@
"default": 3.0, "default": 3.0,
"min_value": "0.0001", "min_value": "0.0001",
"max_value_warning": "100", "max_value_warning": "100",
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\"",
"global_only": "True",
"visible": false
}, },
"raft_speed": { "raft_speed": {
"label": "Raft Print Speed", "label": "Raft Print Speed",
@ -1717,6 +1793,8 @@
"max_value_warning": "200", "max_value_warning": "200",
"enabled": "adhesion_type == \"raft\"", "enabled": "adhesion_type == \"raft\"",
"inherit_function": "speed_print / 60 * 30", "inherit_function": "speed_print / 60 * 30",
"global_only": "True",
"visible": false,
"children": { "children": {
"raft_surface_speed": { "raft_surface_speed": {
"label": "Raft Surface Print Speed", "label": "Raft Surface Print Speed",
@ -1727,7 +1805,9 @@
"min_value": "0.1", "min_value": "0.1",
"max_value_warning": "100", "max_value_warning": "100",
"enabled": "adhesion_type == \"raft\"", "enabled": "adhesion_type == \"raft\"",
"inherit_function": "parent_value" "inherit_function": "parent_value",
"global_only": "True",
"visible": false
}, },
"raft_interface_speed": { "raft_interface_speed": {
"label": "Raft Interface Print Speed", "label": "Raft Interface Print Speed",
@ -1738,7 +1818,9 @@
"min_value": "0.1", "min_value": "0.1",
"max_value_warning": "150", "max_value_warning": "150",
"enabled": "adhesion_type == \"raft\"", "enabled": "adhesion_type == \"raft\"",
"inherit_function": "0.5 * parent_value" "inherit_function": "0.5 * parent_value",
"global_only": "True",
"visible": false
}, },
"raft_base_speed": { "raft_base_speed": {
"label": "Raft Base Print Speed", "label": "Raft Base Print Speed",
@ -1749,7 +1831,9 @@
"min_value": "0.1", "min_value": "0.1",
"max_value_warning": "200", "max_value_warning": "200",
"enabled": "adhesion_type == \"raft\"", "enabled": "adhesion_type == \"raft\"",
"inherit_function": "0.5 * parent_value" "inherit_function": "0.5 * parent_value",
"global_only": "True",
"visible": false
} }
} }
}, },
@ -1761,6 +1845,7 @@
"min_value": "0", "min_value": "0",
"max_value": "100", "max_value": "100",
"default": 100, "default": 100,
"global_only": "True",
"visible": false, "visible": false,
"enabled": "adhesion_type == \"raft\"", "enabled": "adhesion_type == \"raft\"",
"children": { "children": {
@ -1772,6 +1857,7 @@
"min_value": "0", "min_value": "0",
"max_value": "100", "max_value": "100",
"default": 100, "default": 100,
"global_only": "True",
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
@ -1784,6 +1870,7 @@
"min_value": "0", "min_value": "0",
"max_value": "100", "max_value": "100",
"default": 100, "default": 100,
"global_only": "True",
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
@ -1796,6 +1883,7 @@
"min_value": "0", "min_value": "0",
"max_value": "100", "max_value": "100",
"default": 100, "default": 100,
"global_only": "True",
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "adhesion_type == \"raft\"" "enabled": "adhesion_type == \"raft\""
@ -1865,7 +1953,7 @@
"surface": "Surface", "surface": "Surface",
"both": "Both" "both": "Both"
}, },
"default": "Normal", "default": "normal",
"visible": false "visible": false
}, },
"magic_spiralize": { "magic_spiralize": {
@ -1874,7 +1962,7 @@
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"magic_fuzzy_skin_enabled": { "magic_fuzzy_skin_enabled": {
"label": "Fuzzy Skin", "label": "Fuzzy Skin",
@ -1926,7 +2014,7 @@
"type": "boolean", "type": "boolean",
"default": false, "default": false,
"visible": false, "visible": false,
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_height": { "wireframe_height": {
"label": "WP Connection Height", "label": "WP Connection Height",
@ -1938,7 +2026,7 @@
"max_value_warning": "20", "max_value_warning": "20",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_roof_inset": { "wireframe_roof_inset": {
"label": "WP Roof Inset Distance", "label": "WP Roof Inset Distance",
@ -1952,7 +2040,7 @@
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"inherit_function": "wireframe_height", "inherit_function": "wireframe_height",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_printspeed": { "wireframe_printspeed": {
"label": "WP speed", "label": "WP speed",
@ -1964,7 +2052,7 @@
"max_value_warning": "50", "max_value_warning": "50",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"", "global_only": "True",
"children": { "children": {
"wireframe_printspeed_bottom": { "wireframe_printspeed_bottom": {
"label": "WP Bottom Printing Speed", "label": "WP Bottom Printing Speed",
@ -1977,7 +2065,7 @@
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_printspeed_up": { "wireframe_printspeed_up": {
"label": "WP Upward Printing Speed", "label": "WP Upward Printing Speed",
@ -1990,7 +2078,7 @@
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_printspeed_down": { "wireframe_printspeed_down": {
"label": "WP Downward Printing Speed", "label": "WP Downward Printing Speed",
@ -2003,7 +2091,7 @@
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_printspeed_flat": { "wireframe_printspeed_flat": {
"label": "WP Horizontal Printing Speed", "label": "WP Horizontal Printing Speed",
@ -2016,7 +2104,7 @@
"visible": false, "visible": false,
"inherit": true, "inherit": true,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
} }
} }
}, },
@ -2030,7 +2118,7 @@
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"", "global_only": "True",
"children": { "children": {
"wireframe_flow_connection": { "wireframe_flow_connection": {
"label": "WP Connection Flow", "label": "WP Connection Flow",
@ -2042,7 +2130,7 @@
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_flow_flat": { "wireframe_flow_flat": {
"label": "WP Flat Flow", "label": "WP Flat Flow",
@ -2054,7 +2142,7 @@
"type": "float", "type": "float",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
} }
} }
}, },
@ -2068,7 +2156,7 @@
"max_value_warning": "1", "max_value_warning": "1",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_bottom_delay": { "wireframe_bottom_delay": {
"label": "WP Bottom Delay", "label": "WP Bottom Delay",
@ -2080,7 +2168,7 @@
"max_value_warning": "1", "max_value_warning": "1",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_flat_delay": { "wireframe_flat_delay": {
"label": "WP Flat Delay", "label": "WP Flat Delay",
@ -2092,7 +2180,7 @@
"max_value_warning": "0.5", "max_value_warning": "0.5",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_up_half_speed": { "wireframe_up_half_speed": {
"label": "WP Ease Upward", "label": "WP Ease Upward",
@ -2104,7 +2192,7 @@
"max_value_warning": "5.0", "max_value_warning": "5.0",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_top_jump": { "wireframe_top_jump": {
"label": "WP Knot Size", "label": "WP Knot Size",
@ -2116,7 +2204,7 @@
"max_value_warning": "2.0", "max_value_warning": "2.0",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_fall_down": { "wireframe_fall_down": {
"label": "WP Fall Down", "label": "WP Fall Down",
@ -2128,7 +2216,7 @@
"max_value_warning": "wireframe_height", "max_value_warning": "wireframe_height",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_drag_along": { "wireframe_drag_along": {
"label": "WP Drag along", "label": "WP Drag along",
@ -2140,7 +2228,7 @@
"max_value_warning": "wireframe_height", "max_value_warning": "wireframe_height",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_strategy": { "wireframe_strategy": {
"label": "WP Strategy", "label": "WP Strategy",
@ -2154,7 +2242,7 @@
"default": "compensate", "default": "compensate",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_straight_before_down": { "wireframe_straight_before_down": {
"label": "WP Straighten Downward Lines", "label": "WP Straighten Downward Lines",
@ -2166,7 +2254,7 @@
"max_value": "100", "max_value": "100",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_roof_fall_down": { "wireframe_roof_fall_down": {
"label": "WP Roof Fall Down", "label": "WP Roof Fall Down",
@ -2178,7 +2266,7 @@
"max_value_warning": "wireframe_roof_inset", "max_value_warning": "wireframe_roof_inset",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_roof_drag_along": { "wireframe_roof_drag_along": {
"label": "WP Roof Drag Along", "label": "WP Roof Drag Along",
@ -2190,7 +2278,7 @@
"max_value_warning": "10", "max_value_warning": "10",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_roof_outer_delay": { "wireframe_roof_outer_delay": {
"label": "WP Roof Outer Delay", "label": "WP Roof Outer Delay",
@ -2202,7 +2290,7 @@
"max_value_warning": "2.0", "max_value_warning": "2.0",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
}, },
"wireframe_nozzle_clearance": { "wireframe_nozzle_clearance": {
"label": "WP Nozzle Clearance", "label": "WP Nozzle Clearance",
@ -2214,7 +2302,7 @@
"max_value_warning": "10.0", "max_value_warning": "10.0",
"visible": false, "visible": false,
"enabled": "wireframe_enabled", "enabled": "wireframe_enabled",
"global_only": "print_sequence != \"one_at_a_time\"" "global_only": "True"
} }
} }
} }

View File

@ -1,13 +1,13 @@
{ {
"id": "innovo-inventor", "id": "innovo-inventor",
"name": "Innovo INVENTOR",
"manufacturer": "INNOVO",
"author": "AR",
"version": 1, "version": 1,
"icon": "", "name": "Innovo INVENTOR",
"manufacturer": "Other",
"author": "AR",
"platform": "inventor_platform.stl", "platform": "inventor_platform.stl",
"platform_texture": "", "file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "fdmprinter.json",
"machine_settings": { "machine_settings": {
"machine_width": {"default": 340}, "machine_width": {"default": 340},
"machine_height": {"default": 290}, "machine_height": {"default": 290},
@ -24,7 +24,8 @@
"machine_nozzle_offset_y_1": {"default": 15}, "machine_nozzle_offset_y_1": {"default": 15},
"machine_gcode_flavor": {"default": "RepRap (Marlin/Sprinter)"}, "machine_gcode_flavor": {"default": "RepRap (Marlin/Sprinter)"},
"machine_start_gcode": {"default": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position"}, "machine_start_gcode": {"default": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position"},
"machine_end_gcode": {"default": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors"} "machine_end_gcode": {"default": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors"},
"machine_platform_offset": {"default": [-180, -0.25, 160]}
}, },
"overrides": { "overrides": {

View File

@ -0,0 +1,15 @@
{
"id": "ultimaker_base",
"version": 1,
"visible": false,
"name": "Ultimaker",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"inherits": "fdmprinter.json",
"machine_preferences": {
"prefered_profile": "Normal Quality",
"prefered_variant": "0.4 mm",
"prefered_material": "PLA"
}
}

View File

@ -9,11 +9,14 @@
"platform_texture": "Ultimaker2backplate.png", "platform_texture": "Ultimaker2backplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "ultimaker.json",
"pages": [
"SelectUpgradedPartsUM2"
],
"machine_extruder_trains": { "machine_extruder_trains": [
"0": { {
"machine_nozzle_heat_up_speed": { "machine_nozzle_heat_up_speed": {
"default": 2.0 "default": 2.0
}, },
@ -33,8 +36,8 @@
"default": 16 "default": 16
} }
} }
}, ],
"overrides": { "machine_settings": {
"machine_start_gcode" : { "default": "" }, "machine_start_gcode" : { "default": "" },
"machine_end_gcode" : { "default": "" }, "machine_end_gcode" : { "default": "" },
"machine_width": { "default": 230 }, "machine_width": { "default": 230 },
@ -80,11 +83,17 @@
"machine_nozzle_tip_outer_diameter": { "default": 1.0 }, "machine_nozzle_tip_outer_diameter": { "default": 1.0 },
"machine_nozzle_head_distance": { "default": 3.0 }, "machine_nozzle_head_distance": { "default": 3.0 },
"machine_nozzle_expansion_angle": { "default": 45 }, "machine_nozzle_expansion_angle": { "default": 45 }
},
"overrides": {
"material_print_temperature": { "enabled": "False" }, "material_print_temperature": { "enabled": "False" },
"material_bed_temperature": { "enabled": "False" }, "material_bed_temperature": { "enabled": "False" },
"material_diameter": { "enabled": "False" }, "material_diameter": { "enabled": "False" },
"material_flow": { "enabled": "False" } "material_flow": { "enabled": "False" },
"retraction_amount": { "enabled": "False" },
"retraction_speed": { "enabled": "False" },
"retraction_retract_speed": { "enabled": "False" },
"retraction_prime_speed": { "enabled": "False" }
} }
} }

View File

@ -10,7 +10,11 @@
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2.json", "inherits": "ultimaker2.json",
"overrides": { "pages": [
"SelectUpgradedPartsUM2"
],
"machine_settings": {
"machine_width": { "default": 230 }, "machine_width": { "default": 230 },
"machine_depth": { "default": 225 }, "machine_depth": { "default": 225 },
"machine_height": { "default": 315 } "machine_height": { "default": 315 }

View File

@ -0,0 +1,20 @@
{
"id": "ultimaker2_extended_olsson_base",
"version": 1,
"name": "Ultimaker 2 Extended with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2.json",
"machine_settings": {
"machine_width": { "default": 230 },
"machine_depth": { "default": 225 },
"machine_height": { "default": 310 },
"machine_show_variants": { "default": true },
"gantry_height": { "default": 50 }
}
}

View File

@ -0,0 +1,17 @@
{
"id": "ultimaker2_extended_olsson",
"version": 1,
"name": "Ultimaker 2 Extended with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_olsson.json",
"variant": "0.25 mm",
"profiles_machine": "ultimaker2_olsson",
"machine_settings": {
"machine_nozzle_size": { "default": 0.25 }
}
}

View File

@ -0,0 +1,18 @@
{
"id": "ultimaker2_extended_olsson",
"version": 1,
"name": "Ultimaker 2 Extended with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_olsson.json",
"variant": "0.4 mm",
"profiles_machine": "ultimaker2_olsson",
"machine_settings": {
"machine_nozzle_size": { "default": 0.40 }
}
}

View File

@ -0,0 +1,18 @@
{
"id": "ultimaker2_extended_olsson",
"version": 1,
"name": "Ultimaker 2 Extended with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_olsson.json",
"variant": "0.6 mm",
"profiles_machine": "ultimaker2_olsson",
"machine_settings": {
"machine_nozzle_size": { "default": 0.60 }
}
}

View File

@ -0,0 +1,18 @@
{
"id": "ultimaker2_extended_olsson",
"version": 1,
"name": "Ultimaker 2 Extended with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"file_formats": "text/x-gcode",
"visible": false,
"inherits": "ultimaker2_extended_olsson.json",
"variant": "0.8 mm",
"profiles_machine": "ultimaker2_olsson",
"machine_settings": {
"machine_nozzle_size": { "default": 0.80 }
}
}

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"visible": false, "visible": false,
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json", "inherits": "ultimaker2_extended_plus.json",
"variant": "0.25 mm", "variant": "0.25 mm",

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json", "inherits": "ultimaker2_extended_plus.json",
"variant": "0.4 mm", "variant": "0.4 mm",

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json", "inherits": "ultimaker2_extended_plus.json",
"variant": "0.6 mm", "variant": "0.6 mm",

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2ExtendedPlusbackplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2_extended_plus.json", "inherits": "ultimaker2_extended_plus.json",
"variant": "0.8 mm", "variant": "0.8 mm",

View File

@ -0,0 +1,16 @@
{
"id": "ultimaker2_olsson_base",
"version": 1,
"name": "Ultimaker 2 with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2.json",
"overrides": {
"machine_show_variants": { "default": true }
}
}

View File

@ -0,0 +1,21 @@
{
"id": "ultimaker2_olsson",
"version": 1,
"name": "Ultimaker 2 with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_olsson.json",
"variant": "0.25 mm",
"overrides": {
"machine_nozzle_size": { "default": 0.25 },
"coasting_volume": { "default": 0.1 },
"coasting_min_volume": { "default": 0.17 }
}
}

View File

@ -0,0 +1,18 @@
{
"id": "ultimaker2_olsson",
"version": 1,
"name": "Ultimaker 2 with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_olsson.json",
"variant": "0.4 mm",
"overrides": {
"machine_nozzle_size": { "default": 0.40 }
}
}

View File

@ -0,0 +1,19 @@
{
"id": "ultimaker2_olsson",
"version": 1,
"name": "Ultimaker 2 with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_olsson.json",
"variant": "0.6 mm",
"overrides": {
"machine_nozzle_size": { "default": 0.60 },
"coasting_volume": { "default": 1.36 }
}
}

View File

@ -0,0 +1,19 @@
{
"id": "ultimaker2_olsson",
"version": 1,
"name": "Ultimaker 2 with Olsson Block",
"manufacturer": "Ultimaker",
"author": "Ultimaker",
"platform": "ultimaker2_platform.obj",
"platform_texture": "Ultimaker2backplate.png",
"visible": false,
"file_formats": "text/x-gcode",
"inherits": "ultimaker2_olsson.json",
"variant": "0.8 mm",
"overrides": {
"machine_nozzle_size": { "default": 0.80 },
"coasting_volume": { "default": 3.22 }
}
}

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2Plusbackplate.png",
"visible": false, "visible": false,
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2.json", "inherits": "ultimaker2.json",
@ -16,28 +16,26 @@
"machine_height": { "default": 200 }, "machine_height": { "default": 200 },
"machine_show_variants": { "default": true }, "machine_show_variants": { "default": true },
"gantry_height": { "default": 50 }, "gantry_height": { "default": 50 },
"shell_thickness": { "default": 1.2 }, "machine_head_with_fans_polygon":
"top_bottom_thickness": { "inherit_function": "(parent_value / 3) * 2" }, {
"travel_compensate_overlapping_walls_enabled": { "default": true }, "default": [
"skin_alternate_rotation": { "default": true }, [
"skin_outline_count": { "default": 2 }, -44,
"infill_sparse_density": { "default": 10 }, 14
"infill_overlap": { "default": 0.056, "inherit_function": "0.14 * line_width if infill_sparse_density < 95 else 0" }, ],
"infill_wipe_dist": { "default": 0.35, "inherit_function": "wall_line_width_0" }, [
"retraction_amount": { "default": 6 }, -44,
"retraction_min_travel": { "default": 4.5 }, -34
"retraction_count_max": { "default": 6 }, ],
"retraction_extrusion_window": { "default": 6.0 }, [
"speed_print": { "default": 50 }, 64,
"speed_wall": { "inherit_function": "parent_value / 50 * 30" }, 14
"speed_wall_x": { "inherit_function": "speed_print / 50 * 40" }, ],
"speed_topbottom": { "inherit_function": "parent_value / 50 * 20" }, [
"speed_layer_0": { "default": 20 }, 64,
"skirt_speed": { "default": 20 }, -34
"travel_avoid_distance": { "default": 1.0 }, ]
"coasting_enable": { "default": true }, ]
"coasting_volume": { "default": 0.4 }, }
"support_angle": { "default": 50 },
"adhesion_type": { "default": "brim" }
} }
} }

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2Plusbackplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
@ -13,16 +13,6 @@
"overrides": { "overrides": {
"machine_nozzle_size": { "default": 0.25 }, "machine_nozzle_size": { "default": 0.25 },
"layer_height": { "default": 0.06 },
"layer_height_0": { "default": 0.15 },
"infill_sparse_density": { "default": 12 },
"speed_print": { "default": 30 },
"speed_wall": { "inherit_function": "parent_value / 30 * 20" },
"speed_wall_x": { "inherit_function": "speed_print / 30 * 25" },
"speed_topbottom": { "inherit_function": "parent_value / 30 * 20" },
"coasting_volume": { "default": 0.1 }, "coasting_volume": { "default": 0.1 },
"coasting_min_volume": { "default": 0.17 } "coasting_min_volume": { "default": 0.17 }
} }

View File

@ -5,16 +5,13 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2Plusbackplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
"variant": "0.4 mm", "variant": "0.4 mm",
"overrides": { "overrides": {
"machine_nozzle_size": { "default": 0.40 }, "machine_nozzle_size": { "default": 0.40 }
"wall_line_width_0": { "inherit_function": "parent_value * 0.875" },
"skin_line_width": { "inherit_function": "parent_value * 0.875" }
} }
} }

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2Plusbackplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
@ -13,18 +13,6 @@
"overrides": { "overrides": {
"machine_nozzle_size": { "default": 0.60 }, "machine_nozzle_size": { "default": 0.60 },
"layer_height": { "default": 0.15 },
"layer_height_0": { "default": 0.4 },
"shell_thickness": { "default": 1.8 },
"infill_sparse_density": { "default": 15 },
"speed_print": { "default": 55 },
"speed_wall": { "inherit_function": "parent_value / 55 * 25" },
"speed_wall_x": { "inherit_function": "speed_print / 55 * 40" },
"speed_topbottom": { "inherit_function": "parent_value / 55 * 20" },
"coasting_volume": { "default": 1.36 } "coasting_volume": { "default": 1.36 }
} }
} }

View File

@ -5,7 +5,7 @@
"manufacturer": "Ultimaker", "manufacturer": "Ultimaker",
"author": "Ultimaker", "author": "Ultimaker",
"platform": "ultimaker2_platform.obj", "platform": "ultimaker2_platform.obj",
"platform_texture": "ultimaker2plus_backplate.png", "platform_texture": "Ultimaker2Plusbackplate.png",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "ultimaker2plus.json", "inherits": "ultimaker2plus.json",
@ -13,19 +13,6 @@
"overrides": { "overrides": {
"machine_nozzle_size": { "default": 0.80 }, "machine_nozzle_size": { "default": 0.80 },
"layer_height": { "default": 0.2 },
"layer_height_0": { "default": 0.5 },
"shell_thickness": { "default": 2.4 },
"top_bottom_thickness": { "inherit_function": "parent_value / 2" },
"infill_sparse_density": { "default": 16 },
"speed_print": { "default": 40 },
"speed_wall": { "inherit_function": "parent_value / 40 * 20" },
"speed_wall_x": { "inherit_function": "speed_print / 40 * 30" },
"speed_topbottom": { "inherit_function": "parent_value / 40 * 20" },
"coasting_volume": { "default": 3.22 } "coasting_volume": { "default": 3.22 }
} }
} }

View File

@ -7,7 +7,7 @@
"icon": "icon_ultimaker.png", "icon": "icon_ultimaker.png",
"platform": "ultimaker_platform.stl", "platform": "ultimaker_platform.stl",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"inherits": "fdmprinter.json", "inherits": "ultimaker.json",
"pages": [ "pages": [
"SelectUpgradedParts", "SelectUpgradedParts",

View File

@ -5,7 +5,7 @@ name = ABS
[settings] [settings]
material_bed_temperature = 100 material_bed_temperature = 100
platform_adhesion = Brim platform_adhesion = brim
material_flow = 107 material_flow = 107
material_print_temperature = 250 material_print_temperature = 250
cool_fan_speed = 50 cool_fan_speed = 50

View File

@ -5,7 +5,7 @@ name = CPE
[settings] [settings]
material_bed_temperature = 60 material_bed_temperature = 60
platform_adhesion = Brim platform_adhesion = brim
material_flow = 100 material_flow = 100
material_print_temperature = 250 material_print_temperature = 250
cool_fan_speed = 50 cool_fan_speed = 50

View File

@ -5,7 +5,7 @@ name = PLA
[settings] [settings]
material_bed_temperature = 60 material_bed_temperature = 60
platform_adhesion = Skirt platform_adhesion = skirt
material_flow = 100 material_flow = 100
material_print_temperature = 210 material_print_temperature = 210
cool_fan_speed = 100 cool_fan_speed = 100

View File

@ -0,0 +1,26 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.25 mm
material = ABS
[settings]
layer_height = 0.06
top_bottom_thickness = 0.72
layer_height_0 = 0.15
speed_wall_x = 25
wall_thickness = 0.88
speed_infill = 30
speed_topbottom = 20
adhesion_type = brim
speed_print = 20
cool_min_speed = 25
line_width = 0.22
infill_sparse_density = 22
machine_nozzle_size = 0.22
speed_wall_0 = 20
cool_min_layer_time = 2
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -1,51 +1,26 @@
[general] [general]
version = 1 version = 1
name = Fast Prints name = Fast Print
machine_type = ultimaker2plus machine_type = ultimaker2plus
machine_variant = 0.4 mm machine_variant = 0.4 mm
material = ABS material = ABS
[settings] [settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
cool_min_layer_time = 3
support_enable = False
retraction_combing = All
speed_travel = 150
cool_min_speed = 20
brim_line_count = 20
top_thickness = 0.75
material_flow = 100.0
cool_lift_head = True
speed_print = 40
retraction_hop = 0.0
machine_nozzle_size = 0.35
layer_height = 0.15 layer_height = 0.15
speed_wall_0 = 30
raft_interface_line_spacing = 3.0
speed_topbottom = 30
speed_infill = 55
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
infill_sparse_density = 18
shell_thickness = 0.7
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 0.0525
speed_wall_x = 40
skirt_minimal_length = 150.0
bottom_thickness = 0.75
layer_height_0 = 0.26
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
top_bottom_thickness = 0.75 top_bottom_thickness = 0.75
skirt_gap = 3.0 layer_height_0 = 0.26
raft_interface_line_width = 0.4 speed_print = 40
speed_wall_x = 40
wall_thickness = 0.7
speed_infill = 55
speed_topbottom = 30
cool_min_layer_time = 3
cool_min_speed = 20
line_width = 0.35
infill_sparse_density = 18
machine_nozzle_size = 0.35
speed_travel = 150
speed_wall_0 = 30
adhesion_type = brim adhesion_type = brim
support_pattern = lines cool_lift_head = True
raft_surface_line_width = 0.4 cool_fan_speed_min = 50
raft_surface_line_spacing = 3.0

View File

@ -6,46 +6,21 @@ machine_variant = 0.4 mm
material = ABS material = ABS
[settings] [settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
cool_min_layer_time = 3
support_enable = False
retraction_combing = All
cool_min_speed = 20
brim_line_count = 20
top_thickness = 0.72
material_flow = 100.0
cool_lift_head = True
speed_print = 30
retraction_hop = 0.0
machine_nozzle_size = 0.35
layer_height = 0.06 layer_height = 0.06
speed_wall_0 = 20
raft_interface_line_spacing = 3.0
speed_topbottom = 20
speed_infill = 45
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
infill_sparse_density = 22
shell_thickness = 1.05
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 0.0525
speed_wall_x = 30
skirt_minimal_length = 150.0
speed_layer_0 = 20
bottom_thickness = 0.72
layer_height_0 = 0.26
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
top_bottom_thickness = 0.72 top_bottom_thickness = 0.72
skirt_gap = 3.0 layer_height_0 = 0.26
raft_interface_line_width = 0.4 speed_print = 30
speed_wall_x = 30
wall_thickness = 1.05
speed_infill = 45
speed_topbottom = 20
adhesion_type = brim adhesion_type = brim
support_pattern = lines cool_min_speed = 20
raft_surface_line_width = 0.4 line_width = 0.35
raft_surface_line_spacing = 3.0 infill_sparse_density = 22
machine_nozzle_size = 0.35
speed_wall_0 = 20
cool_min_layer_time = 3
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -6,41 +6,18 @@ machine_variant = 0.4 mm
material = ABS material = ABS
[settings] [settings]
raft_surface_thickness = 0.27 layer_height_0 = 0.26
raft_base_line_width = 1.0
raft_margin = 5.0
support_enable = False
retraction_combing = All
cool_min_speed = 20
brim_line_count = 20
material_flow = 100.0
cool_lift_head = True
speed_print = 30 speed_print = 30
retraction_hop = 0.0 speed_wall_x = 30
wall_thickness = 1.05
speed_infill = 45
speed_topbottom = 20
cool_min_layer_time = 3
cool_min_speed = 20
line_width = 0.35
machine_nozzle_size = 0.35 machine_nozzle_size = 0.35
speed_wall_0 = 20 speed_wall_0 = 20
raft_interface_line_spacing = 3.0
speed_topbottom = 20
speed_infill = 45
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
shell_thickness = 1.05
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 0.0525
speed_wall_x = 30
skirt_minimal_length = 150.0
speed_layer_0 = 20
layer_height_0 = 0.26
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
cool_min_layer_time = 3
skirt_gap = 3.0
raft_interface_line_width = 0.4
adhesion_type = brim adhesion_type = brim
support_pattern = lines cool_lift_head = True
raft_surface_line_width = 0.4 cool_fan_speed_min = 50
raft_surface_line_spacing = 3.0

View File

@ -6,45 +6,20 @@ machine_variant = 0.6 mm
material = ABS material = ABS
[settings] [settings]
raft_surface_thickness = 0.27
raft_base_line_width = 1.0
raft_margin = 5.0
cool_min_layer_time = 3
support_enable = False
retraction_combing = All
cool_min_speed = 20
brim_line_count = 14
top_thickness = 1.2
material_flow = 100.0
cool_lift_head = True
speed_print = 25
retraction_hop = 0.0
machine_nozzle_size = 0.53
layer_height = 0.15 layer_height = 0.15
speed_wall_0 = 20
raft_interface_line_spacing = 3.0
speed_topbottom = 20
speed_infill = 55
infill_before_walls = False
retraction_speed = 40.0
skin_no_small_gaps_heuristic = False
shell_thickness = 1.59
cool_fan_speed_max = 100
raft_airgap = 0.0
material_bed_temperature = 70
infill_overlap = 0.0795
speed_wall_x = 30
skirt_minimal_length = 150.0
speed_layer_0 = 20
bottom_thickness = 1.2
layer_height_0 = 0.39
magic_mesh_surface_mode = False
cool_fan_speed_min = 50
top_bottom_thickness = 1.2 top_bottom_thickness = 1.2
skirt_gap = 3.0 layer_height_0 = 0.39
raft_interface_line_width = 0.4 speed_print = 25
speed_wall_x = 30
wall_thickness = 1.59
speed_infill = 55
speed_topbottom = 20
adhesion_type = brim adhesion_type = brim
support_pattern = lines cool_min_speed = 20
raft_surface_line_width = 0.4 line_width = 0.53
raft_surface_line_spacing = 3.0 machine_nozzle_size = 0.53
speed_wall_0 = 20
cool_min_layer_time = 3
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -0,0 +1,25 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.8 mm
material = ABS
[settings]
layer_height = 0.2
top_bottom_thickness = 1.2
layer_height_0 = 0.5
speed_print = 20
speed_wall_x = 30
wall_thickness = 2.1
speed_infill = 40
speed_topbottom = 20
adhesion_type = brim
cool_min_speed = 15
line_width = 0.7
machine_nozzle_size = 0.7
speed_wall_0 = 20
cool_min_layer_time = 3
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -0,0 +1,26 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.25 mm
material = CPE
[settings]
infill_overlap = 17
layer_height = 0.06
wall_thickness = 0.88
layer_height_0 = 0.15
speed_wall_x = 25
top_bottom_thickness = 0.72
speed_infill = 30
speed_topbottom = 20
cool_min_layer_time = 2
speed_print = 20
line_width = 0.22
infill_sparse_density = 22
machine_nozzle_size = 0.22
speed_wall_0 = 20
adhesion_type = brim
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -1,50 +1,27 @@
[general] [general]
version = 1 version = 1
name = Fast Prints name = Fast Print
machine_type = ultimaker2plus machine_type = ultimaker2plus
machine_variant = 0.4 mm machine_variant = 0.4 mm
material = CPE material = CPE
[settings] [settings]
cool_fan_speed_min = 50 infill_overlap = 17
retraction_hop = 0.0
skin_no_small_gaps_heuristic = False
raft_airgap = 0.0
speed_travel = 150
raft_surface_thickness = 0.27
raft_interface_line_spacing = 3.0
support_enable = False
raft_surface_line_width = 0.4
raft_surface_line_spacing = 3.0
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3 cool_min_layer_time = 3
layer_height = 0.15 layer_height = 0.15
raft_margin = 5.0 wall_thickness = 0.7
speed_infill = 45
bottom_thickness = 0.75
brim_line_count = 20
cool_lift_head = True
retraction_speed = 40.0
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 30
shell_thickness = 0.7
speed_wall_0 = 30
material_flow = 100.0
support_pattern = lines
infill_sparse_density = 18
raft_interface_line_width = 0.4
layer_height_0 = 0.26 layer_height_0 = 0.26
material_bed_temperature = 70 speed_print = 30
top_thickness = 0.75
top_bottom_thickness = 0.75
speed_wall_x = 40 speed_wall_x = 40
infill_overlap = 0.0595 top_bottom_thickness = 0.75
infill_before_walls = False speed_infill = 45
skirt_minimal_length = 150.0
speed_topbottom = 20 speed_topbottom = 20
skirt_gap = 3.0 speed_travel = 150
raft_base_line_width = 1.0 line_width = 0.35
infill_sparse_density = 18
machine_nozzle_size = 0.35 machine_nozzle_size = 0.35
speed_wall_0 = 30
adhesion_type = brim
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -6,45 +6,20 @@ machine_variant = 0.4 mm
material = CPE material = CPE
[settings] [settings]
cool_fan_speed_min = 50
retraction_hop = 0.0
support_enable = False
raft_airgap = 0.0
raft_surface_thickness = 0.27
raft_interface_line_spacing = 3.0
skin_no_small_gaps_heuristic = False
bottom_thickness = 0.72
raft_surface_line_spacing = 3.0
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3
layer_height = 0.06 layer_height = 0.06
raft_margin = 5.0
speed_infill = 45
speed_layer_0 = 20
brim_line_count = 20
cool_lift_head = True
retraction_speed = 40.0
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 20
shell_thickness = 1.05
speed_wall_0 = 20
material_flow = 100.0
support_pattern = lines
infill_sparse_density = 22
raft_interface_line_width = 0.4
layer_height_0 = 0.26
material_bed_temperature = 70
top_thickness = 0.72
top_bottom_thickness = 0.72 top_bottom_thickness = 0.72
layer_height_0 = 0.26
speed_print = 20
speed_wall_x = 30 speed_wall_x = 30
infill_overlap = 0.0525 wall_thickness = 1.05
infill_before_walls = False speed_infill = 45
raft_surface_line_width = 0.4
skirt_minimal_length = 150.0
speed_topbottom = 20 speed_topbottom = 20
skirt_gap = 3.0 adhesion_type = brim
raft_base_line_width = 1.0 line_width = 0.35
infill_sparse_density = 22
machine_nozzle_size = 0.35 machine_nozzle_size = 0.35
speed_wall_0 = 20
cool_min_layer_time = 3
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -6,40 +6,17 @@ machine_variant = 0.4 mm
material = CPE material = CPE
[settings] [settings]
retraction_hop = 0.0
support_enable = False
raft_airgap = 0.0
raft_surface_thickness = 0.27
support_pattern = lines
raft_interface_line_spacing = 3.0
skin_no_small_gaps_heuristic = False
raft_surface_line_width = 0.4
cool_fan_speed_min = 50
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3
infill_before_walls = False
speed_layer_0 = 20
brim_line_count = 20
cool_lift_head = True
raft_interface_line_width = 0.4
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 20
shell_thickness = 1.05
speed_wall_0 = 20
material_flow = 100.0
raft_surface_line_spacing = 3.0
raft_margin = 5.0
retraction_speed = 40.0
layer_height_0 = 0.26 layer_height_0 = 0.26
material_bed_temperature = 70 speed_print = 20
speed_wall_x = 30 speed_wall_x = 30
infill_overlap = 0.0525 wall_thickness = 1.05
speed_infill = 45 speed_infill = 45
skirt_minimal_length = 150.0
speed_topbottom = 20 speed_topbottom = 20
skirt_gap = 3.0 cool_min_layer_time = 3
raft_base_line_width = 1.0 line_width = 0.35
machine_nozzle_size = 0.35 machine_nozzle_size = 0.35
speed_wall_0 = 20
adhesion_type = brim
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -6,44 +6,20 @@ machine_variant = 0.6 mm
material = CPE material = CPE
[settings] [settings]
cool_fan_speed_min = 50 infill_overlap = 17
retraction_hop = 0.0
support_enable = False
raft_airgap = 0.0
raft_surface_thickness = 0.27
raft_interface_line_spacing = 3.0
skin_no_small_gaps_heuristic = False
bottom_thickness = 1.2
support_pattern = lines
retraction_combing = All
adhesion_type = brim
cool_min_layer_time = 3
layer_height = 0.15 layer_height = 0.15
speed_infill = 40
speed_layer_0 = 20
brim_line_count = 14
cool_lift_head = True
retraction_speed = 40.0
cool_fan_speed_max = 100
magic_mesh_surface_mode = False
speed_print = 20
shell_thickness = 1.59
speed_wall_0 = 20
material_flow = 100.0
raft_surface_line_spacing = 3.0
raft_margin = 5.0
raft_interface_line_width = 0.4
layer_height_0 = 0.39
material_bed_temperature = 70
top_thickness = 1.2
top_bottom_thickness = 1.2 top_bottom_thickness = 1.2
layer_height_0 = 0.39
speed_wall_x = 30 speed_wall_x = 30
infill_overlap = 0.0901 wall_thickness = 1.59
infill_before_walls = False speed_infill = 40
raft_surface_line_width = 0.4
skirt_minimal_length = 150.0
speed_topbottom = 20 speed_topbottom = 20
skirt_gap = 3.0 cool_min_layer_time = 3
raft_base_line_width = 1.0 speed_print = 20
line_width = 0.53
machine_nozzle_size = 0.53 machine_nozzle_size = 0.53
speed_wall_0 = 20
adhesion_type = brim
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -0,0 +1,25 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.8 mm
material = CPE
[settings]
infill_overlap = 17
layer_height = 0.2
top_bottom_thickness = 1.2
layer_height_0 = 0.5
speed_wall_x = 30
wall_thickness = 2.1
speed_infill = 40
speed_topbottom = 20
cool_min_layer_time = 3
speed_print = 20
line_width = 0.7
machine_nozzle_size = 0.7
speed_wall_0 = 20
adhesion_type = brim
cool_lift_head = True
cool_fan_speed_min = 50

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.25 mm
material = PLA
[settings]
machine_nozzle_size = 0.22
layer_height = 0.06
layer_height_0 = 0.15
shell_thickness = 0.88
top_bottom_thickness = 0.72
top_bottom_pattern = lines
infill_sparse_density = 22
infill_wipe_dist = 0.1
retraction_amount = 6
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 30
speed_wall_0 = 20
speed_wall_x = 25
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -1,47 +1,32 @@
[general] [general]
version = 1 version = 1
name = Fast Prints name = Fast Print
machine_type = ultimaker2plus machine_type = ultimaker2plus
machine_variant = 0.4 mm machine_variant = 0.4 mm
material = PLA material = PLA
[settings] [settings]
retraction_combing = All
top_thickness = 0.75
speed_print = 40
speed_wall_0 = 40
raft_surface_line_spacing = 3.0
shell_thickness = 0.7
infill_sparse_density = 18
retraction_hop = 0.0
material_bed_temperature = 70
skin_no_small_gaps_heuristic = False
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
layer_height = 0.15
brim_line_count = 22
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
infill_overlap = 0.0525
raft_interface_line_width = 0.4
speed_topbottom = 30
support_pattern = lines
layer_height_0 = 0.26
raft_interface_line_spacing = 3.0
material_flow = 100.0
cool_fan_speed_min = 100
cool_fan_speed_max = 100
speed_travel = 150
skirt_gap = 3.0
magic_mesh_surface_mode = False
bottom_thickness = 0.75
speed_wall_x = 50
machine_nozzle_size = 0.35 machine_nozzle_size = 0.35
top_bottom_thickness = 0.75 layer_height = 0.15
support_enable = False layer_height_0 = 0.26
shell_thickness = 0.7
top_bottom_thickness = 0.6
top_bottom_pattern = lines
infill_sparse_density = 18
infill_wipe_dist = 0.2
retraction_amount = 5.5
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 60
speed_wall_0 = 40
speed_wall_x = 50
speed_topbottom = 30
speed_travel = 150
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -6,43 +6,26 @@ machine_variant = 0.4 mm
material = PLA material = PLA
[settings] [settings]
retraction_combing = All
top_thickness = 0.72
speed_layer_0 = 20
speed_print = 30
speed_wall_0 = 30
raft_interface_line_spacing = 3.0
shell_thickness = 1.05
infill_overlap = 0.0525
retraction_hop = 0.0
material_bed_temperature = 70
skin_no_small_gaps_heuristic = False
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
layer_height = 0.06
brim_line_count = 22
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
skirt_gap = 3.0
raft_interface_line_width = 0.4
speed_topbottom = 20
support_pattern = lines
layer_height_0 = 0.26
infill_sparse_density = 22
material_flow = 100.0
cool_fan_speed_min = 100
top_bottom_thickness = 0.72
cool_fan_speed_max = 100
speed_infill = 50
magic_mesh_surface_mode = False
bottom_thickness = 0.72
speed_wall_x = 40
machine_nozzle_size = 0.35 machine_nozzle_size = 0.35
raft_surface_line_spacing = 3.0 layer_height = 0.06
support_enable = False layer_height_0 = 0.26
shell_thickness = 1.05
top_bottom_thickness = 0.84
top_bottom_pattern = lines
infill_sparse_density = 22
infill_wipe_dist = 0.2
retraction_amount = 5.5
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 50
speed_wall_0 = 30
speed_wall_x = 40
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -6,38 +6,26 @@ machine_variant = 0.4 mm
material = PLA material = PLA
[settings] [settings]
retraction_combing = All
shell_thickness = 1.05
speed_print = 30
speed_wall_0 = 30
raft_interface_line_spacing = 3.0
speed_layer_0 = 20
layer_height_0 = 0.26
retraction_hop = 0.0
material_bed_temperature = 70
skirt_gap = 3.0
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
brim_line_count = 22
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
infill_overlap = 0.0525
raft_interface_line_width = 0.4
speed_topbottom = 20
support_pattern = lines
speed_infill = 50
material_flow = 100.0
cool_fan_speed_min = 100
cool_fan_speed_max = 100
skin_no_small_gaps_heuristic = False
magic_mesh_surface_mode = False
speed_wall_x = 40
machine_nozzle_size = 0.35 machine_nozzle_size = 0.35
raft_surface_line_spacing = 3.0 layer_height = 0.1
support_enable = False layer_height_0 = 0.26
shell_thickness = 1.05
top_bottom_thickness = 0.8
top_bottom_pattern = lines
infill_sparse_density = 20
infill_wipe_dist = 0.2
retraction_amount = 5.5
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 50
speed_wall_0 = 30
speed_wall_x = 40
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = Ulti Quality
machine_type = ultimaker2plus
machine_variant = 0.4 mm
material = PLA
[settings]
machine_nozzle_size = 0.35
layer_height = 0.04
layer_height_0 = 0.26
shell_thickness = 1.4
top_bottom_thickness = 1.12
top_bottom_pattern = lines
infill_sparse_density = 25
infill_wipe_dist = 0.2
retraction_amount = 5.5
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 50
speed_wall_0 = 30
speed_wall_x = 40
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -6,42 +6,26 @@ machine_variant = 0.6 mm
material = PLA material = PLA
[settings] [settings]
retraction_combing = All
top_thickness = 1.2
speed_layer_0 = 20
speed_print = 25
speed_wall_0 = 25
raft_interface_line_spacing = 3.0
shell_thickness = 1.59
infill_overlap = 0.0795
retraction_hop = 0.0
material_bed_temperature = 70
skin_no_small_gaps_heuristic = False
retraction_speed = 40.0
raft_surface_line_width = 0.4
raft_base_line_width = 1.0
raft_margin = 5.0
adhesion_type = brim
skirt_minimal_length = 150.0
layer_height = 0.15
brim_line_count = 15
infill_before_walls = False
raft_surface_thickness = 0.27
raft_airgap = 0.0
skirt_gap = 3.0
raft_interface_line_width = 0.4
speed_topbottom = 20
support_pattern = lines
layer_height_0 = 0.39
material_flow = 100.0
cool_fan_speed_min = 100
top_bottom_thickness = 1.2
cool_fan_speed_max = 100
speed_infill = 55
magic_mesh_surface_mode = False
bottom_thickness = 1.2
speed_wall_x = 40
machine_nozzle_size = 0.53 machine_nozzle_size = 0.53
raft_surface_line_spacing = 3.0 layer_height = 0.15
support_enable = False layer_height_0 = 0.4
shell_thickness = 1.59
top_bottom_thickness = 1.2
top_bottom_pattern = lines
infill_sparse_density = 20
infill_wipe_dist = 0.3
retraction_amount = 6
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 55
speed_wall_0 = 25
speed_wall_x = 40
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1.2
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 20
adhesion_type = brim

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2plus
machine_variant = 0.8 mm
material = PLA
[settings]
machine_nozzle_size = 0.7
layer_height = 0.2
layer_height_0 = 0.5
shell_thickness = 2.1
top_bottom_thickness = 1.6
top_bottom_pattern = lines
infill_sparse_density = 20
infill_wipe_dist = 0.4
retraction_amount = 6
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 40
speed_wall_0 = 20
speed_wall_x = 30
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1.6
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 25
adhesion_type = brim

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2_olsson
machine_variant = 0.25 mm
[settings]
machine_nozzle_size = 0.22
layer_height = 0.06
layer_height_0 = 0.15
shell_thickness = 0.88
top_bottom_thickness = 0.72
top_bottom_pattern = lines
infill_sparse_density = 22
infill_overlap = 0.022
infill_wipe_dist = 0.1
retraction_amount = 6
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 30
speed_wall_0 = 20
speed_wall_x = 25
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -0,0 +1,32 @@
[general]
version = 1
name = Fast Print
machine_type = ultimaker2_olsson
machine_variant = 0.4 mm
[settings]
machine_nozzle_size = 0.35
layer_height = 0.15
layer_height_0 = 0.26
shell_thickness = 0.7
top_bottom_thickness = 0.6
top_bottom_pattern = lines
infill_sparse_density = 18
infill_overlap = 0.035
infill_wipe_dist = 0.2
retraction_amount = 5.5
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 60
speed_wall_0 = 40
speed_wall_x = 50
speed_topbottom = 30
speed_travel = 150
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = High Quality
machine_type = ultimaker2_olsson
machine_variant = 0.4 mm
[settings]
machine_nozzle_size = 0.35
layer_height = 0.06
layer_height_0 = 0.26
shell_thickness = 1.05
top_bottom_thickness = 0.84
top_bottom_pattern = lines
infill_sparse_density = 22
infill_overlap = 0.035
infill_wipe_dist = 0.2
retraction_amount = 5.5
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 50
speed_wall_0 = 30
speed_wall_x = 40
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2_olsson
machine_variant = 0.4 mm
[settings]
machine_nozzle_size = 0.35
layer_height = 0.1
layer_height_0 = 0.26
shell_thickness = 1.05
top_bottom_thickness = 0.8
top_bottom_pattern = lines
infill_sparse_density = 20
infill_overlap = 0.035
infill_wipe_dist = 0.2
retraction_amount = 5.5
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 50
speed_wall_0 = 30
speed_wall_x = 40
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = Ulti Quality
machine_type = ultimaker2_olsson
machine_variant = 0.4 mm
[settings]
machine_nozzle_size = 0.35
layer_height = 0.04
layer_height_0 = 0.26
shell_thickness = 1.4
top_bottom_thickness = 1.12
top_bottom_pattern = lines
infill_sparse_density = 25
infill_overlap = 0.035
infill_wipe_dist = 0.2
retraction_amount = 5.5
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 50
speed_wall_0 = 30
speed_wall_x = 40
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 15
adhesion_type = brim

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2_olsson
machine_variant = 0.6 mm
[settings]
machine_nozzle_size = 0.53
layer_height = 0.15
layer_height_0 = 0.4
shell_thickness = 1.59
top_bottom_thickness = 1.2
top_bottom_pattern = lines
infill_sparse_density = 20
infill_overlap = 0.053
infill_wipe_dist = 0.3
retraction_amount = 6
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 55
speed_wall_0 = 25
speed_wall_x = 40
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1.2
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 20
adhesion_type = brim

View File

@ -0,0 +1,31 @@
[general]
version = 1
name = Normal Quality
machine_type = ultimaker2_olsson
machine_variant = 0.8 mm
[settings]
machine_nozzle_size = 0.7
layer_height = 0.2
layer_height_0 = 0.5
shell_thickness = 2.1
top_bottom_thickness = 1.6
top_bottom_pattern = lines
infill_sparse_density = 20
infill_overlap = 0.07
infill_wipe_dist = 0.4
retraction_amount = 6
retraction_min_travel = 0.5
retraction_count_max = 30
retraction_extrusion_window = 6
speed_infill = 40
speed_wall_0 = 20
speed_wall_x = 30
speed_topbottom = 20
speed_layer_0 = 25
skirt_speed = 25
speed_slowdown_layers = 2
travel_avoid_distance = 1.6
cool_fan_full_layer = 2
cool_min_layer_time_fan_speed_max = 25
adhesion_type = brim

View File

@ -24,7 +24,7 @@ UM.Dialog
width: parent.width * 0.75 width: parent.width * 0.75
height: width * (1/4.25) height: width * (1/4.25)
source: UM.Theme.images.logo source: UM.Theme.getImage("logo")
sourceSize.width: width sourceSize.width: width
sourceSize.height: height sourceSize.height: height
@ -38,7 +38,7 @@ UM.Dialog
id: version id: version
text: "Cura %1".arg(UM.Application.version) text: "Cura %1".arg(UM.Application.version)
font: UM.Theme.fonts.large font: UM.Theme.getFont("large")
anchors.horizontalCenter : logo.horizontalCenter anchors.horizontalCenter : logo.horizontalCenter
anchors.horizontalCenterOffset : (logo.width * 0.25) anchors.horizontalCenterOffset : (logo.width * 0.25)
anchors.top: logo.bottom anchors.top: logo.bottom

View File

@ -92,7 +92,7 @@ UM.MainWindow
text: catalog.i18nc("@action:inmenu menubar:file", "&Save Selection to File"); text: catalog.i18nc("@action:inmenu menubar:file", "&Save Selection to File");
enabled: UM.Selection.hasSelection; enabled: UM.Selection.hasSelection;
iconName: "document-save-as"; iconName: "document-save-as";
onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", Printer.jobName, false); onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", Printer.jobName, { "filter_by_machine": false });
} }
Menu Menu
{ {
@ -108,7 +108,7 @@ UM.MainWindow
MenuItem MenuItem
{ {
text: model.description; text: model.description;
onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, Printer.jobName, false); onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, Printer.jobName, { "filter_by_machine": false });
} }
onObjectAdded: saveAllMenu.insertItem(index, object) onObjectAdded: saveAllMenu.insertItem(index, object)
onObjectRemoved: saveAllMenu.removeItem(object) onObjectRemoved: saveAllMenu.removeItem(object)
@ -214,13 +214,24 @@ UM.MainWindow
Instantiator Instantiator
{ {
id: profileMenuInstantiator
model: UM.ProfilesModel { } model: UM.ProfilesModel { }
MenuItem { MenuItem {
text: model.name; text: model.name;
checkable: true; checkable: true;
checked: model.active; checked: model.active;
exclusiveGroup: profileMenuGroup; exclusiveGroup: profileMenuGroup;
onTriggered: UM.MachineManager.setActiveProfile(model.name) onTriggered:
{
UM.MachineManager.setActiveProfile(model.name);
if (!model.active) {
//Selecting a profile was canceled; undo menu selection
profileMenuInstantiator.model.setProperty(index, "active", false);
var activeProfileName = UM.MachineManager.activeProfile;
var activeProfileIndex = profileMenuInstantiator.model.find("name", activeProfileName);
profileMenuInstantiator.model.setProperty(activeProfileIndex, "active", true);
}
}
} }
onObjectAdded: profileMenu.insertItem(index, object) onObjectAdded: profileMenu.insertItem(index, object)
onObjectRemoved: profileMenu.removeItem(object) onObjectRemoved: profileMenu.removeItem(object)
@ -326,8 +337,8 @@ UM.MainWindow
{ {
bottom: parent.bottom; bottom: parent.bottom;
right: sidebar.left; right: sidebar.left;
bottomMargin: UM.Theme.sizes.default_margin.height; bottomMargin: UM.Theme.getSize("default_margin").height;
rightMargin: UM.Theme.sizes.default_margin.width; rightMargin: UM.Theme.getSize("default_margin").width;
} }
} }
@ -336,7 +347,7 @@ UM.MainWindow
anchors anchors
{ {
horizontalCenter: parent.horizontalCenter horizontalCenter: parent.horizontalCenter
horizontalCenterOffset: -(UM.Theme.sizes.sidebar.width/ 2) horizontalCenterOffset: -(UM.Theme.getSize("sidebar").width/ 2)
top: parent.verticalCenter; top: parent.verticalCenter;
bottom: parent.bottom; bottom: parent.bottom;
} }
@ -350,10 +361,10 @@ UM.MainWindow
//anchors.right: parent.right; //anchors.right: parent.right;
//anchors.bottom: parent.bottom //anchors.bottom: parent.bottom
anchors.top: viewModeButton.bottom anchors.top: viewModeButton.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height; anchors.topMargin: UM.Theme.getSize("default_margin").height;
anchors.left: viewModeButton.left; anchors.left: viewModeButton.left;
//anchors.bottom: buttons.top; //anchors.bottom: buttons.top;
//anchors.bottomMargin: UM.Theme.sizes.default_margin.height; //anchors.bottomMargin: UM.Theme.getSize("default_margin").height;
height: childrenRect.height; height: childrenRect.height;
@ -365,15 +376,15 @@ UM.MainWindow
id: openFileButton; id: openFileButton;
//style: UM.Backend.progress < 0 ? UM.Theme.styles.open_file_button : UM.Theme.styles.tool_button; //style: UM.Backend.progress < 0 ? UM.Theme.styles.open_file_button : UM.Theme.styles.tool_button;
text: catalog.i18nc("@action:button","Open File"); text: catalog.i18nc("@action:button","Open File");
iconSource: UM.Theme.icons.load iconSource: UM.Theme.getIcon("load")
style: UM.Theme.styles.tool_button style: UM.Theme.styles.tool_button
tooltip: ''; tooltip: '';
anchors anchors
{ {
top: parent.top; top: parent.top;
//topMargin: UM.Theme.sizes.loadfile_margin.height //topMargin: UM.Theme.getSize("loadfile_margin").height
left: parent.left; left: parent.left;
//leftMargin: UM.Theme.sizes.loadfile_margin.width //leftMargin: UM.Theme.getSize("loadfile_margin").width
} }
action: actions.open; action: actions.open;
} }
@ -384,14 +395,14 @@ UM.MainWindow
anchors anchors
{ {
left: parent.left left: parent.left
leftMargin: UM.Theme.sizes.default_margin.width; leftMargin: UM.Theme.getSize("default_margin").width;
bottom: parent.bottom bottom: parent.bottom
bottomMargin: UM.Theme.sizes.default_margin.height; bottomMargin: UM.Theme.getSize("default_margin").height;
} }
source: UM.Theme.images.logo; source: UM.Theme.getImage("logo");
width: UM.Theme.sizes.logo.width; width: UM.Theme.getSize("logo").width;
height: UM.Theme.sizes.logo.height; height: UM.Theme.getSize("logo").height;
z: -1; z: -1;
sourceSize.width: width; sourceSize.width: width;
@ -405,11 +416,11 @@ UM.MainWindow
anchors anchors
{ {
top: toolbar.bottom; top: toolbar.bottom;
topMargin: UM.Theme.sizes.window_margin.height; topMargin: UM.Theme.getSize("window_margin").height;
left: parent.left; left: parent.left;
} }
text: catalog.i18nc("@action:button","View Mode"); text: catalog.i18nc("@action:button","View Mode");
iconSource: UM.Theme.icons.viewmode; iconSource: UM.Theme.getIcon("viewmode");
style: UM.Theme.styles.tool_button; style: UM.Theme.styles.tool_button;
tooltip: ''; tooltip: '';
@ -442,7 +453,7 @@ UM.MainWindow
anchors { anchors {
top: openFileButton.bottom; top: openFileButton.bottom;
topMargin: UM.Theme.sizes.window_margin.height; topMargin: UM.Theme.getSize("window_margin").height;
left: parent.left; left: parent.left;
} }
} }
@ -458,18 +469,28 @@ UM.MainWindow
right: parent.right; right: parent.right;
} }
width: UM.Theme.sizes.sidebar.width; width: UM.Theme.getSize("sidebar").width;
addMachineAction: actions.addMachine; addMachineAction: actions.addMachine;
configureMachinesAction: actions.configureMachines; configureMachinesAction: actions.configureMachines;
addProfileAction: actions.addProfile; addProfileAction: actions.addProfile;
manageProfilesAction: actions.manageProfiles; manageProfilesAction: actions.manageProfiles;
configureSettingsAction: Action
{
onTriggered:
{
preferences.visible = true;
preferences.setPage(2);
preferences.getCurrentItem().scrollToSection(source.key);
}
}
} }
Rectangle Rectangle
{ {
x: base.mouseX + UM.Theme.sizes.default_margin.width; x: base.mouseX + UM.Theme.getSize("default_margin").width;
y: base.mouseY + UM.Theme.sizes.default_margin.height; y: base.mouseY + UM.Theme.getSize("default_margin").height;
width: childrenRect.width; width: childrenRect.width;
height: childrenRect.height; height: childrenRect.height;
@ -491,25 +512,22 @@ UM.MainWindow
{ {
//; Remove & re-add the general page as we want to use our own instead of uranium standard. //; Remove & re-add the general page as we want to use our own instead of uranium standard.
removePage(0); removePage(0);
insertPage(0, catalog.i18nc("@title:tab","General"), generalPage); insertPage(0, catalog.i18nc("@title:tab","General"), Qt.resolvedUrl("GeneralPage.qml"));
//: View preferences page title //: View preferences page title
insertPage(1, catalog.i18nc("@title:tab","View"), viewPage); insertPage(1, catalog.i18nc("@title:tab","View"), Qt.resolvedUrl("ViewPage.qml"));
//Force refresh //Force refresh
setPage(0) setPage(0)
} }
Item { onVisibleChanged:
visible: false
GeneralPage
{ {
id: generalPage if(!visible)
}
ViewPage
{ {
id: viewPage // When the dialog closes, switch to the General page.
// This prevents us from having a heavy page like Setting Visiblity active in the background.
setPage(0);
} }
} }
} }
@ -582,7 +600,7 @@ UM.MainWindow
addMachine.onTriggered: addMachineWizard.visible = true; addMachine.onTriggered: addMachineWizard.visible = true;
addProfile.onTriggered: { UM.MachineManager.createProfile(); preferences.visible = true; preferences.setPage(4); } addProfile.onTriggered: { UM.MachineManager.createProfile(); preferences.visible = true; preferences.setPage(4); }
preferences.onTriggered: { preferences.visible = true; preferences.setPage(0); } preferences.onTriggered: { preferences.visible = true; }
configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); } configureMachines.onTriggered: { preferences.visible = true; preferences.setPage(3); }
manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); } manageProfiles.onTriggered: { preferences.visible = true; preferences.setPage(4); }
@ -649,7 +667,7 @@ UM.MainWindow
//TODO: Support multiple file selection, workaround bug in KDE file dialog //TODO: Support multiple file selection, workaround bug in KDE file dialog
//selectMultiple: true //selectMultiple: true
nameFilters: UM.MeshFileHandler.supportedReadFileTypes; nameFilters: UM.MeshFileHandler.supportedReadFileTypes;
folder: Printer.getDefaultPath()
onAccepted: onAccepted:
{ {
//Because several implementations of the file dialog only update the folder //Because several implementations of the file dialog only update the folder
@ -688,11 +706,6 @@ UM.MainWindow
} }
} }
Component.onCompleted:
{
UM.Theme.load(UM.Resources.getPath(UM.Resources.Themes, "cura"))
}
Timer Timer
{ {
id: startupTimer; id: startupTimer;

View File

@ -25,7 +25,6 @@ Rectangle {
property variant printDuration: PrintInformation.currentPrintTime; property variant printDuration: PrintInformation.currentPrintTime;
property real printMaterialAmount: PrintInformation.materialAmount; property real printMaterialAmount: PrintInformation.materialAmount;
width: UM.Theme.sizes.jobspecs.width
height: childrenRect.height height: childrenRect.height
color: "transparent" color: "transparent"
@ -80,7 +79,7 @@ Rectangle {
id: jobNameRow id: jobNameRow
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
height: UM.Theme.sizes.jobspecs_line.height height: UM.Theme.getSize("jobspecs_line").height
visible: base.activity visible: base.activity
Item Item
@ -93,8 +92,8 @@ Rectangle {
id: printJobPencilIcon id: printJobPencilIcon
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
width: UM.Theme.sizes.save_button_specs_icons.width width: UM.Theme.getSize("save_button_specs_icons").width
height: UM.Theme.sizes.save_button_specs_icons.height height: UM.Theme.getSize("save_button_specs_icons").height
onClicked: onClicked:
{ {
@ -108,12 +107,12 @@ Rectangle {
color: "transparent" color: "transparent"
UM.RecolorImage UM.RecolorImage
{ {
width: UM.Theme.sizes.save_button_specs_icons.width width: UM.Theme.getSize("save_button_specs_icons").width
height: UM.Theme.sizes.save_button_specs_icons.height height: UM.Theme.getSize("save_button_specs_icons").height
sourceSize.width: width sourceSize.width: width
sourceSize.height: width sourceSize.height: width
color: control.hovered ? UM.Theme.colors.setting_control_button_hover : UM.Theme.colors.text color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("text");
source: UM.Theme.icons.pencil; source: UM.Theme.getIcon("pencil");
} }
} }
} }
@ -123,15 +122,16 @@ Rectangle {
{ {
id: printJobTextfield id: printJobTextfield
anchors.right: printJobPencilIcon.left anchors.right: printJobPencilIcon.left
anchors.rightMargin: UM.Theme.sizes.default_margin.width/2 anchors.rightMargin: UM.Theme.getSize("default_margin").width/2
height: UM.Theme.sizes.jobspecs_line.height height: UM.Theme.getSize("jobspecs_line").height
width: base.width width: __contentWidth + UM.Theme.getSize("default_margin").width
maximumLength: 120
property int unremovableSpacing: 5 property int unremovableSpacing: 5
text: '' text: ''
horizontalAlignment: TextInput.AlignRight horizontalAlignment: TextInput.AlignRight
onTextChanged: { onTextChanged: {
if(text != ''){ if(text != ''){
//this prevent that is sets an empty string as jobname //Prevent that jobname is set to an empty string
Printer.setJobName(text) Printer.setJobName(text)
} }
} }
@ -144,8 +144,8 @@ Rectangle {
regExp: /^[^\\ \/ \.]*$/ regExp: /^[^\\ \/ \.]*$/
} }
style: TextFieldStyle{ style: TextFieldStyle{
textColor: UM.Theme.colors.setting_control_text; textColor: UM.Theme.getColor("setting_control_text");
font: UM.Theme.fonts.default_bold; font: UM.Theme.getFont("default_bold");
background: Rectangle { background: Rectangle {
opacity: 0 opacity: 0
border.width: 0 border.width: 0
@ -159,10 +159,10 @@ Rectangle {
id: boundingSpec id: boundingSpec
anchors.top: jobNameRow.bottom anchors.top: jobNameRow.bottom
anchors.right: parent.right anchors.right: parent.right
height: UM.Theme.sizes.jobspecs_line.height height: UM.Theme.getSize("jobspecs_line").height
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
font: UM.Theme.fonts.small font: UM.Theme.getFont("small")
color: UM.Theme.colors.text_subtext color: UM.Theme.getColor("text_subtext")
text: Printer.getSceneBoundingBoxString text: Printer.getSceneBoundingBoxString
} }
@ -170,7 +170,7 @@ Rectangle {
id: specsRow id: specsRow
anchors.top: boundingSpec.bottom anchors.top: boundingSpec.bottom
anchors.right: parent.right anchors.right: parent.right
height: UM.Theme.sizes.jobspecs_line.height height: UM.Theme.getSize("jobspecs_line").height
Item{ Item{
width: parent.width width: parent.width
@ -179,42 +179,42 @@ Rectangle {
UM.RecolorImage { UM.RecolorImage {
id: timeIcon id: timeIcon
anchors.right: timeSpec.left anchors.right: timeSpec.left
anchors.rightMargin: UM.Theme.sizes.default_margin.width/2 anchors.rightMargin: UM.Theme.getSize("default_margin").width/2
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
width: UM.Theme.sizes.save_button_specs_icons.width width: UM.Theme.getSize("save_button_specs_icons").width
height: UM.Theme.sizes.save_button_specs_icons.height height: UM.Theme.getSize("save_button_specs_icons").height
sourceSize.width: width sourceSize.width: width
sourceSize.height: width sourceSize.height: width
color: UM.Theme.colors.text_subtext color: UM.Theme.getColor("text_subtext")
source: UM.Theme.icons.print_time; source: UM.Theme.getIcon("print_time");
} }
Label{ Label{
id: timeSpec id: timeSpec
anchors.right: lengthIcon.left anchors.right: lengthIcon.left
anchors.rightMargin: UM.Theme.sizes.default_margin.width anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
font: UM.Theme.fonts.small font: UM.Theme.getFont("small")
color: UM.Theme.colors.text_subtext color: UM.Theme.getColor("text_subtext")
text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short) text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short)
} }
UM.RecolorImage { UM.RecolorImage {
id: lengthIcon id: lengthIcon
anchors.right: lengthSpec.left anchors.right: lengthSpec.left
anchors.rightMargin: UM.Theme.sizes.default_margin.width/2 anchors.rightMargin: UM.Theme.getSize("default_margin").width/2
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
width: UM.Theme.sizes.save_button_specs_icons.width width: UM.Theme.getSize("save_button_specs_icons").width
height: UM.Theme.sizes.save_button_specs_icons.height height: UM.Theme.getSize("save_button_specs_icons").height
sourceSize.width: width sourceSize.width: width
sourceSize.height: width sourceSize.height: width
color: UM.Theme.colors.text_subtext color: UM.Theme.getColor("text_subtext")
source: UM.Theme.icons.category_material; source: UM.Theme.getIcon("category_material");
} }
Label{ Label{
id: lengthSpec id: lengthSpec
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
font: UM.Theme.fonts.small font: UM.Theme.getFont("small")
color: UM.Theme.colors.text_subtext color: UM.Theme.getColor("text_subtext")
text: base.printMaterialAmount <= 0 ? catalog.i18nc("@label", "0.0 m") : catalog.i18nc("@label", "%1 m").arg(base.printMaterialAmount) text: base.printMaterialAmount <= 0 ? catalog.i18nc("@label", "0.0 m") : catalog.i18nc("@label", "%1 m").arg(base.printMaterialAmount)
} }
} }

View File

@ -18,18 +18,18 @@ Item{
Rectangle{ Rectangle{
id: globalProfileRow id: globalProfileRow
anchors.top: base.top anchors.top: base.top
height: UM.Theme.sizes.sidebar_setup.height height: UM.Theme.getSize("sidebar_setup").height
width: base.width width: base.width
Label{ Label{
id: globalProfileLabel id: globalProfileLabel
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width; anchors.leftMargin: UM.Theme.getSize("default_margin").width;
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
text: catalog.i18nc("@label","Profile:"); text: catalog.i18nc("@label","Profile:");
width: parent.width/100*45 width: parent.width/100*45
font: UM.Theme.fonts.default; font: UM.Theme.getFont("default");
color: UM.Theme.colors.text; color: UM.Theme.getColor("text");
} }
@ -37,9 +37,9 @@ Item{
id: globalProfileSelection id: globalProfileSelection
text: UM.MachineManager.activeProfile text: UM.MachineManager.activeProfile
width: parent.width/100*55 width: parent.width/100*55
height: UM.Theme.sizes.setting_control.height height: UM.Theme.getSize("setting_control").height
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
tooltip: UM.MachineManager.activeProfile tooltip: UM.MachineManager.activeProfile
style: UM.Theme.styles.sidebar_header_button style: UM.Theme.styles.sidebar_header_button
@ -49,6 +49,7 @@ Item{
id: profileSelectionMenu id: profileSelectionMenu
Instantiator Instantiator
{ {
id: profileSelectionInstantiator
model: UM.ProfilesModel { } model: UM.ProfilesModel { }
MenuItem MenuItem
{ {
@ -56,7 +57,17 @@ Item{
checkable: true; checkable: true;
checked: model.active; checked: model.active;
exclusiveGroup: profileSelectionMenuGroup; exclusiveGroup: profileSelectionMenuGroup;
onTriggered: UM.MachineManager.setActiveProfile(model.name) onTriggered:
{
UM.MachineManager.setActiveProfile(model.name);
if (!model.active) {
//Selecting a profile was canceled; undo menu selection
profileSelectionInstantiator.model.setProperty(index, "active", false);
var activeProfileName = UM.MachineManager.activeProfile;
var activeProfileIndex = profileSelectionInstantiator.model.find("name", activeProfileName);
profileSelectionInstantiator.model.setProperty(activeProfileIndex, "active", true);
}
}
} }
onObjectAdded: profileSelectionMenu.insertItem(index, object) onObjectAdded: profileSelectionMenu.insertItem(index, object)
onObjectRemoved: profileSelectionMenu.removeItem(object) onObjectRemoved: profileSelectionMenu.removeItem(object)

View File

@ -16,7 +16,7 @@ Rectangle {
property int backendState: UM.Backend.state; property int backendState: UM.Backend.state;
property bool activity: Printer.getPlatformActivity; property bool activity: Printer.getPlatformActivity;
//Behavior on progress { NumberAnimation { duration: 250; } } //Behavior on progress { NumberAnimation { duration: 250; } }
property int totalHeight: childrenRect.height + UM.Theme.sizes.default_margin.height property int totalHeight: childrenRect.height + UM.Theme.getSize("default_margin").height
property string fileBaseName property string fileBaseName
property string statusText: { property string statusText: {
if(base.backendState == 0) { if(base.backendState == 0) {
@ -34,32 +34,32 @@ Rectangle {
Label { Label {
id: statusLabel id: statusLabel
width: parent.width - 2 * UM.Theme.sizes.default_margin.width width: parent.width - 2 * UM.Theme.getSize("default_margin").width
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width anchors.leftMargin: UM.Theme.getSize("default_margin").width
color: UM.Theme.colors.text color: UM.Theme.getColor("text")
font: UM.Theme.fonts.large font: UM.Theme.getFont("large")
text: statusText; text: statusText;
} }
Rectangle{ Rectangle{
id: progressBar id: progressBar
width: parent.width - 2 * UM.Theme.sizes.default_margin.width width: parent.width - 2 * UM.Theme.getSize("default_margin").width
height: UM.Theme.sizes.progressbar.height height: UM.Theme.getSize("progressbar").height
anchors.top: statusLabel.bottom anchors.top: statusLabel.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height/4 anchors.topMargin: UM.Theme.getSize("default_margin").height/4
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width anchors.leftMargin: UM.Theme.getSize("default_margin").width
radius: UM.Theme.sizes.progressbar_radius.width radius: UM.Theme.getSize("progressbar_radius").width
color: UM.Theme.colors.progressbar_background color: UM.Theme.getColor("progressbar_background")
Rectangle{ Rectangle{
width: Math.max(parent.width * base.progress) width: Math.max(parent.width * base.progress)
height: parent.height height: parent.height
color: UM.Theme.colors.progressbar_control color: UM.Theme.getColor("progressbar_control")
radius: UM.Theme.sizes.progressbar_radius.width radius: UM.Theme.getSize("progressbar_radius").width
visible: base.backendState == 1 ? true : false visible: base.backendState == 1 ? true : false
} }
} }
@ -69,48 +69,48 @@ Rectangle {
width: base.width width: base.width
height: saveToButton.height height: saveToButton.height
anchors.top: progressBar.bottom anchors.top: progressBar.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.left: parent.left anchors.left: parent.left
Button { Button {
id: saveToButton id: saveToButton
property int resizedWidth
x: base.width - saveToButton.resizedWidth - UM.Theme.sizes.default_margin.width - UM.Theme.sizes.save_button_save_to_button.height + UM.Theme.sizes.save_button_save_to_button.width
tooltip: UM.OutputDeviceManager.activeDeviceDescription; tooltip: UM.OutputDeviceManager.activeDeviceDescription;
enabled: base.backendState == 2 && base.activity == true enabled: base.backendState == 2 && base.activity == true
height: UM.Theme.sizes.save_button_save_to_button.height height: UM.Theme.getSize("save_button_save_to_button").height
width: 150
anchors.top: parent.top anchors.top: parent.top
anchors.right: deviceSelectionMenu.left;
anchors.rightMargin: -3 * UM.Theme.getSize("default_lining").width;
text: UM.OutputDeviceManager.activeDeviceShortDescription text: UM.OutputDeviceManager.activeDeviceShortDescription
onClicked: onClicked:
{ {
UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice, Printer.jobName, true) UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice, Printer.jobName, { "filter_by_machine": true })
} }
style: ButtonStyle { style: ButtonStyle {
background: Rectangle { background:
//opacity: control.enabled ? 1.0 : 0.5 Rectangle
//Behavior on opacity { NumberAnimation { duration: 50; } } {
border.width: UM.Theme.sizes.default_lining.width border.width: UM.Theme.getSize("default_lining").width
border.color: !control.enabled ? UM.Theme.colors.action_button_disabled_border : border.color: !control.enabled ? UM.Theme.getColor("action_button_disabled_border") :
control.pressed ? UM.Theme.colors.action_button_active_border : control.pressed ? UM.Theme.getColor("action_button_active_border") :
control.hovered ? UM.Theme.colors.action_button_hovered_border : UM.Theme.colors.action_button_border control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
color: !control.enabled ? UM.Theme.colors.action_button_disabled : color: !control.enabled ? UM.Theme.getColor("action_button_disabled") :
control.pressed ? UM.Theme.colors.action_button_active : control.pressed ? UM.Theme.getColor("action_button_active") :
control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
Behavior on color { ColorAnimation { duration: 50; } } Behavior on color { ColorAnimation { duration: 50; } }
width: {
saveToButton.resizedWidth = actualLabel.width + (UM.Theme.sizes.default_margin.width * 2) implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2)
return saveToButton.resizedWidth
}
Label { Label {
id: actualLabel id: actualLabel
//Behavior on opacity { NumberAnimation { duration: 50; } }
anchors.centerIn: parent anchors.centerIn: parent
color: !control.enabled ? UM.Theme.colors.action_button_disabled_text : color: !control.enabled ? UM.Theme.getColor("action_button_disabled_text") :
control.pressed ? UM.Theme.colors.action_button_active_text : control.pressed ? UM.Theme.getColor("action_button_active_text") :
control.hovered ? UM.Theme.colors.action_button_hovered_text : UM.Theme.colors.action_button_text control.hovered ? UM.Theme.getColor("action_button_hovered_text") : UM.Theme.getColor("action_button_text")
font: UM.Theme.fonts.action_button font: UM.Theme.getFont("action_button")
text: control.text; text: control.text;
} }
} }
@ -123,39 +123,41 @@ Rectangle {
tooltip: catalog.i18nc("@info:tooltip","Select the active output device"); tooltip: catalog.i18nc("@info:tooltip","Select the active output device");
anchors.top: parent.top anchors.top: parent.top
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width
width: UM.Theme.sizes.save_button_save_to_button.height anchors.rightMargin: UM.Theme.getSize("default_margin").width
height: UM.Theme.sizes.save_button_save_to_button.height width: UM.Theme.getSize("save_button_save_to_button").height
height: UM.Theme.getSize("save_button_save_to_button").height
enabled: base.backendState == 2 && base.activity == true enabled: base.backendState == 2 && base.activity == true
//iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName]; //iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName];
style: ButtonStyle { style: ButtonStyle {
background: Rectangle { background: Rectangle {
id: deviceSelectionIcon id: deviceSelectionIcon
border.width: UM.Theme.sizes.default_lining.width border.width: UM.Theme.getSize("default_lining").width
border.color: !control.enabled ? UM.Theme.colors.action_button_disabled_border : border.color: !control.enabled ? UM.Theme.getColor("action_button_disabled_border") :
control.pressed ? UM.Theme.colors.action_button_active_border : control.pressed ? UM.Theme.getColor("action_button_active_border") :
control.hovered ? UM.Theme.colors.action_button_hovered_border : UM.Theme.colors.action_button_border control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
color: !control.enabled ? UM.Theme.colors.action_button_disabled : color: !control.enabled ? UM.Theme.getColor("action_button_disabled") :
control.pressed ? UM.Theme.colors.action_button_active : control.pressed ? UM.Theme.getColor("action_button_active") :
control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
Behavior on color { ColorAnimation { duration: 50; } } Behavior on color { ColorAnimation { duration: 50; } }
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.save_button_text_margin.width / 2; anchors.leftMargin: UM.Theme.getSize("save_button_text_margin").width / 2;
width: parent.height width: parent.height
height: parent.height height: parent.height
UM.RecolorImage { UM.RecolorImage {
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
width: UM.Theme.sizes.standard_arrow.width width: UM.Theme.getSize("standard_arrow").width
height: UM.Theme.sizes.standard_arrow.height height: UM.Theme.getSize("standard_arrow").height
sourceSize.width: width sourceSize.width: width
sourceSize.height: height sourceSize.height: height
color: !control.enabled ? UM.Theme.colors.action_button_disabled_text : color: !control.enabled ? UM.Theme.getColor("action_button_disabled_text") :
control.pressed ? UM.Theme.colors.action_button_active_text : control.pressed ? UM.Theme.getColor("action_button_active_text") :
control.hovered ? UM.Theme.colors.action_button_hovered_text : UM.Theme.colors.action_button_text; control.hovered ? UM.Theme.getColor("action_button_hovered_text") : UM.Theme.getColor("action_button_text");
source: UM.Theme.icons.arrow_bottom; source: UM.Theme.getIcon("arrow_bottom");
} }
} }
label: Label{ } label: Label{ }

View File

@ -16,9 +16,10 @@ Rectangle
property Action configureMachinesAction; property Action configureMachinesAction;
property Action addProfileAction; property Action addProfileAction;
property Action manageProfilesAction; property Action manageProfilesAction;
property Action configureSettingsAction;
property int currentModeIndex; property int currentModeIndex;
color: UM.Theme.colors.sidebar; color: UM.Theme.getColor("sidebar");
UM.I18nCatalog { id: catalog; name:"cura"} UM.I18nCatalog { id: catalog; name:"cura"}
function showTooltip(item, position, text) function showTooltip(item, position, text)
@ -56,10 +57,10 @@ Rectangle
Rectangle { Rectangle {
id: headerSeparator id: headerSeparator
width: parent.width width: parent.width
height: UM.Theme.sizes.sidebar_lining.height height: UM.Theme.getSize("sidebar_lining").height
color: UM.Theme.colors.sidebar_lining color: UM.Theme.getColor("sidebar_lining")
anchors.top: header.bottom anchors.top: header.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
} }
ProfileSetup { ProfileSetup {
@ -67,7 +68,7 @@ Rectangle
addProfileAction: base.addProfileAction addProfileAction: base.addProfileAction
manageProfilesAction: base.manageProfilesAction manageProfilesAction: base.manageProfilesAction
anchors.top: settingsModeSelection.bottom anchors.top: settingsModeSelection.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width width: parent.width
height: totalHeightProfileSetup height: totalHeightProfileSetup
} }
@ -94,22 +95,22 @@ Rectangle
id: settingsModeLabel id: settingsModeLabel
text: catalog.i18nc("@label:listbox","Setup"); text: catalog.i18nc("@label:listbox","Setup");
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width; anchors.leftMargin: UM.Theme.getSize("default_margin").width;
anchors.top: headerSeparator.bottom anchors.top: headerSeparator.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width/100*45 width: parent.width/100*45
font: UM.Theme.fonts.large; font: UM.Theme.getFont("large");
color: UM.Theme.colors.text color: UM.Theme.getColor("text")
} }
Rectangle { Rectangle {
id: settingsModeSelection id: settingsModeSelection
width: parent.width/100*55 width: parent.width/100*55
height: UM.Theme.sizes.sidebar_header_mode_toggle.height height: UM.Theme.getSize("sidebar_header_mode_toggle").height
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.top: headerSeparator.bottom anchors.top: headerSeparator.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
Component{ Component{
id: wizardDelegate id: wizardDelegate
Button { Button {
@ -126,20 +127,20 @@ Rectangle
style: ButtonStyle { style: ButtonStyle {
background: Rectangle { background: Rectangle {
border.width: UM.Theme.sizes.default_lining.width border.width: UM.Theme.getSize("default_lining").width
border.color: control.checked ? UM.Theme.colors.toggle_checked_border : border.color: control.checked ? UM.Theme.getColor("toggle_checked_border") :
control.pressed ? UM.Theme.colors.toggle_active_border : control.pressed ? UM.Theme.getColor("toggle_active_border") :
control.hovered ? UM.Theme.colors.toggle_hovered_border : UM.Theme.colors.toggle_unchecked_border control.hovered ? UM.Theme.getColor("toggle_hovered_border") : UM.Theme.getColor("toggle_unchecked_border")
color: control.checked ? UM.Theme.colors.toggle_checked : color: control.checked ? UM.Theme.getColor("toggle_checked") :
control.pressed ? UM.Theme.colors.toggle_active : control.pressed ? UM.Theme.getColor("toggle_active") :
control.hovered ? UM.Theme.colors.toggle_hovered : UM.Theme.colors.toggle_unchecked control.hovered ? UM.Theme.getColor("toggle_hovered") : UM.Theme.getColor("toggle_unchecked")
Behavior on color { ColorAnimation { duration: 50; } } Behavior on color { ColorAnimation { duration: 50; } }
Label { Label {
anchors.centerIn: parent anchors.centerIn: parent
color: control.checked ? UM.Theme.colors.toggle_checked_text : color: control.checked ? UM.Theme.getColor("toggle_checked_text") :
control.pressed ? UM.Theme.colors.toggle_active_text : control.pressed ? UM.Theme.getColor("toggle_active_text") :
control.hovered ? UM.Theme.colors.toggle_hovered_text : UM.Theme.colors.toggle_unchecked_text control.hovered ? UM.Theme.getColor("toggle_hovered_text") : UM.Theme.getColor("toggle_unchecked_text")
font: UM.Theme.fonts.default font: UM.Theme.getFont("default")
text: control.text; text: control.text;
} }
} }
@ -165,7 +166,7 @@ Rectangle
anchors.bottom: footerSeparator.top anchors.bottom: footerSeparator.top
anchors.top: profileItem.bottom anchors.top: profileItem.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.left: base.left anchors.left: base.left
anchors.right: base.right anchors.right: base.right
@ -201,10 +202,10 @@ Rectangle
Rectangle { Rectangle {
id: footerSeparator id: footerSeparator
width: parent.width width: parent.width
height: UM.Theme.sizes.sidebar_lining.height height: UM.Theme.getSize("sidebar_lining").height
color: UM.Theme.colors.sidebar_lining color: UM.Theme.getColor("sidebar_lining")
anchors.bottom: saveButton.top anchors.bottom: saveButton.top
anchors.bottomMargin: UM.Theme.sizes.default_margin.height anchors.bottomMargin: UM.Theme.getSize("default_margin").height
} }
SaveButton SaveButton
@ -239,7 +240,7 @@ Rectangle
id: sidebarAdvanced; id: sidebarAdvanced;
visible: false; visible: false;
configureSettings: base.configureMachinesAction; configureSettings: base.configureSettingsAction;
onShowTooltip: base.showTooltip(item, location, text) onShowTooltip: base.showTooltip(item, location, text)
onHideTooltip: base.hideTooltip() onHideTooltip: base.hideTooltip()
} }

View File

@ -21,27 +21,27 @@ Item
width: base.width width: base.width
height: 0 height: 0
anchors.top: parent.top anchors.top: parent.top
color: UM.Theme.colors.sidebar_header_bar color: UM.Theme.getColor("sidebar_header_bar")
} }
Label{ Label{
id: printjobTabLabel id: printjobTabLabel
text: catalog.i18nc("@label:listbox","Print Job"); text: catalog.i18nc("@label:listbox","Print Job");
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width; anchors.leftMargin: UM.Theme.getSize("default_margin").width;
anchors.top: sidebarTabRow.bottom anchors.top: sidebarTabRow.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width/100*45 width: parent.width/100*45
font: UM.Theme.fonts.large; font: UM.Theme.getFont("large");
color: UM.Theme.colors.text color: UM.Theme.getColor("text")
} }
Rectangle { Rectangle {
id: machineSelectionRow id: machineSelectionRow
width: base.width width: base.width
height: UM.Theme.sizes.sidebar_setup.height height: UM.Theme.getSize("sidebar_setup").height
anchors.top: printjobTabLabel.bottom anchors.top: printjobTabLabel.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
Label{ Label{
@ -49,20 +49,20 @@ Item
//: Machine selection label //: Machine selection label
text: catalog.i18nc("@label:listbox","Printer:"); text: catalog.i18nc("@label:listbox","Printer:");
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
font: UM.Theme.fonts.default; font: UM.Theme.getFont("default");
color: UM.Theme.colors.text; color: UM.Theme.getColor("text");
} }
ToolButton { ToolButton {
id: machineSelection id: machineSelection
text: UM.MachineManager.activeMachineInstance; text: UM.MachineManager.activeMachineInstance;
width: parent.width/100*55 width: parent.width/100*55
height: UM.Theme.sizes.setting_control.height height: UM.Theme.getSize("setting_control").height
tooltip: UM.MachineManager.activeMachineInstance; tooltip: UM.MachineManager.activeMachineInstance;
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
style: UM.Theme.styles.sidebar_header_button style: UM.Theme.styles.sidebar_header_button
@ -97,30 +97,30 @@ Item
Rectangle { Rectangle {
id: variantRow id: variantRow
anchors.top: machineSelectionRow.bottom anchors.top: machineSelectionRow.bottom
anchors.topMargin: UM.MachineManager.hasVariants ? UM.Theme.sizes.default_margin.height : 0 anchors.topMargin: UM.MachineManager.hasVariants ? UM.Theme.getSize("default_margin").height : 0
width: base.width width: base.width
height: UM.MachineManager.hasVariants ? UM.Theme.sizes.sidebar_setup.height : 0 height: UM.MachineManager.hasVariants ? UM.Theme.getSize("sidebar_setup").height : 0
visible: UM.MachineManager.hasVariants visible: UM.MachineManager.hasVariants
Label{ Label{
id: variantLabel id: variantLabel
text: catalog.i18nc("@label","Nozzle:"); text: catalog.i18nc("@label","Nozzle:");
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width; anchors.leftMargin: UM.Theme.getSize("default_margin").width;
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
width: parent.width/100*45 width: parent.width/100*45
font: UM.Theme.fonts.default; font: UM.Theme.getFont("default");
color: UM.Theme.colors.text; color: UM.Theme.getColor("text");
} }
ToolButton { ToolButton {
id: variantSelection id: variantSelection
text: UM.MachineManager.activeMachineVariant text: UM.MachineManager.activeMachineVariant
width: parent.width/100*55 width: parent.width/100*55
height: UM.Theme.sizes.setting_control.height height: UM.Theme.getSize("setting_control").height
tooltip: UM.MachineManager.activeMachineVariant; tooltip: UM.MachineManager.activeMachineVariant;
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
style: UM.Theme.styles.sidebar_header_button style: UM.Theme.styles.sidebar_header_button
@ -129,6 +129,7 @@ Item
id: variantsSelectionMenu id: variantsSelectionMenu
Instantiator Instantiator
{ {
id: variantSelectionInstantiator
model: UM.MachineVariantsModel { id: variantsModel } model: UM.MachineVariantsModel { id: variantsModel }
MenuItem MenuItem
{ {
@ -136,7 +137,17 @@ Item
checkable: true; checkable: true;
checked: model.active; checked: model.active;
exclusiveGroup: variantSelectionMenuGroup; exclusiveGroup: variantSelectionMenuGroup;
onTriggered: UM.MachineManager.setActiveMachineVariant(variantsModel.getItem(index).name) onTriggered:
{
UM.MachineManager.setActiveMachineVariant(variantsModel.getItem(index).name);
if (typeof(model) !== "undefined" && !model.active) {
//Selecting a variant was canceled; undo menu selection
variantSelectionInstantiator.model.setProperty(index, "active", false);
var activeMachineVariantName = UM.MachineManager.activeMachineVariant;
var activeMachineVariantIndex = variantSelectionInstantiator.model.find("name", activeMachineVariantName);
variantSelectionInstantiator.model.setProperty(activeMachineVariantIndex, "active", true);
}
}
} }
onObjectAdded: variantsSelectionMenu.insertItem(index, object) onObjectAdded: variantsSelectionMenu.insertItem(index, object)
onObjectRemoved: variantsSelectionMenu.removeItem(object) onObjectRemoved: variantsSelectionMenu.removeItem(object)
@ -150,30 +161,30 @@ Item
Rectangle { Rectangle {
id: materialSelectionRow id: materialSelectionRow
anchors.top: variantRow.bottom anchors.top: variantRow.bottom
anchors.topMargin: UM.MachineManager.hasMaterials ? UM.Theme.sizes.default_margin.height : 0 anchors.topMargin: UM.MachineManager.hasMaterials ? UM.Theme.getSize("default_margin").height : 0
width: base.width width: base.width
height: UM.MachineManager.hasMaterials ? UM.Theme.sizes.sidebar_setup.height : 0 height: UM.MachineManager.hasMaterials ? UM.Theme.getSize("sidebar_setup").height : 0
visible: UM.MachineManager.hasMaterials visible: UM.MachineManager.hasMaterials
Label{ Label{
id: materialSelectionLabel id: materialSelectionLabel
text: catalog.i18nc("@label","Material:"); text: catalog.i18nc("@label","Material:");
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width; anchors.leftMargin: UM.Theme.getSize("default_margin").width;
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
width: parent.width/100*45 width: parent.width/100*45
font: UM.Theme.fonts.default; font: UM.Theme.getFont("default");
color: UM.Theme.colors.text; color: UM.Theme.getColor("text");
} }
ToolButton { ToolButton {
id: materialSelection id: materialSelection
text: UM.MachineManager.activeMaterial text: UM.MachineManager.activeMaterial
width: parent.width/100*55 width: parent.width/100*55
height: UM.Theme.sizes.setting_control.height height: UM.Theme.getSize("setting_control").height
tooltip: UM.MachineManager.activeMaterial; tooltip: UM.MachineManager.activeMaterial;
anchors.right: parent.right anchors.right: parent.right
anchors.rightMargin: UM.Theme.sizes.default_margin.width anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
style: UM.Theme.styles.sidebar_header_button style: UM.Theme.styles.sidebar_header_button
@ -182,6 +193,7 @@ Item
id: materialSelectionMenu id: materialSelectionMenu
Instantiator Instantiator
{ {
id: materialSelectionInstantiator
model: UM.MachineMaterialsModel { id: machineMaterialsModel } model: UM.MachineMaterialsModel { id: machineMaterialsModel }
MenuItem MenuItem
{ {
@ -189,7 +201,17 @@ Item
checkable: true; checkable: true;
checked: model.active; checked: model.active;
exclusiveGroup: materialSelectionMenuGroup; exclusiveGroup: materialSelectionMenuGroup;
onTriggered: UM.MachineManager.setActiveMaterial(machineMaterialsModel.getItem(index).name) onTriggered:
{
UM.MachineManager.setActiveMaterial(machineMaterialsModel.getItem(index).name);
if (typeof(model) !== "undefined" && !model.active) {
//Selecting a material was canceled; undo menu selection
materialSelectionInstantiator.model.setProperty(index, "active", false);
var activeMaterialName = UM.MachineManager.activeMaterial;
var activeMaterialIndex = materialSelectionInstantiator.model.find("name", activeMaterialName);
materialSelectionInstantiator.model.setProperty(activeMaterialIndex, "active", true);
}
}
} }
onObjectAdded: materialSelectionMenu.insertItem(index, object) onObjectAdded: materialSelectionMenu.insertItem(index, object)
onObjectRemoved: materialSelectionMenu.removeItem(object) onObjectRemoved: materialSelectionMenu.removeItem(object)

View File

@ -27,19 +27,19 @@ Item
id: infillCellLeft id: infillCellLeft
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
width: base.width/100* 35 - UM.Theme.sizes.default_margin.width width: base.width/100* 35 - UM.Theme.getSize("default_margin").width
height: childrenRect.height height: childrenRect.height
Label{ Label{
id: infillLabel id: infillLabel
//: Infill selection label //: Infill selection label
text: catalog.i18nc("@label","Infill:"); text: catalog.i18nc("@label","Infill:");
font: UM.Theme.fonts.default; font: UM.Theme.getFont("default");
color: UM.Theme.colors.text; color: UM.Theme.getColor("text");
anchors.top: parent.top anchors.top: parent.top
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width anchors.leftMargin: UM.Theme.getSize("default_margin").width
} }
} }
@ -48,7 +48,7 @@ Item
height: childrenRect.height; height: childrenRect.height;
width: base.width / 100 * 65 width: base.width / 100 * 65
spacing: UM.Theme.sizes.default_margin.width spacing: UM.Theme.getSize("default_margin").width
anchors.left: infillCellLeft.right anchors.left: infillCellLeft.right
anchors.top: infillCellLeft.top anchors.top: infillCellLeft.top
@ -81,23 +81,32 @@ Item
Rectangle{ Rectangle{
id: infillIconLining id: infillIconLining
width: (infillCellRight.width - 3 * UM.Theme.sizes.default_margin.width) / 4; width: (infillCellRight.width - 3 * UM.Theme.getSize("default_margin").width) / 4;
height: width height: width
border.color: (infillListView.activeIndex == index) ? UM.Theme.colors.setting_control_selected : border.color: {
(mousearea.containsMouse ? UM.Theme.colors.setting_control_border_highlight : UM.Theme.colors.setting_control_border) if(infillListView.activeIndex == index)
border.width: UM.Theme.sizes.default_lining.width {
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_selected : "transparent" return UM.Theme.getColor("setting_control_selected")
}
else if(mousearea.containsMouse)
{
return UM.Theme.getColor("setting_control_border_highlight")
}
return UM.Theme.getColor("setting_control_border")
}
border.width: UM.Theme.getSize("default_lining").width
color: infillListView.activeIndex == index ? UM.Theme.getColor("setting_control_selected") : "transparent"
UM.RecolorImage { UM.RecolorImage {
id: infillIcon id: infillIcon
anchors.fill: parent; anchors.fill: parent;
anchors.margins: UM.Theme.sizes.infill_button_margin.width anchors.margins: UM.Theme.getSize("infill_button_margin").width
sourceSize.width: width sourceSize.width: width
sourceSize.height: width sourceSize.height: width
source: UM.Theme.icons[model.icon]; source: UM.Theme.getIcon(model.icon);
color: (infillListView.activeIndex == index) ? UM.Theme.colors.text_white : UM.Theme.colors.text color: (infillListView.activeIndex == index) ? UM.Theme.getColor("text_white") : UM.Theme.getColor("text")
} }
MouseArea { MouseArea {
@ -107,7 +116,6 @@ Item
onClicked: { onClicked: {
if (infillListView.activeIndex != index) if (infillListView.activeIndex != index)
{ {
infillListView.activeIndex = index
UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage) UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage)
} }
} }
@ -123,7 +131,7 @@ Item
id: infillLabel id: infillLabel
anchors.top: infillIconLining.bottom anchors.top: infillIconLining.bottom
anchors.horizontalCenter: infillIconLining.horizontalCenter anchors.horizontalCenter: infillIconLining.horizontalCenter
color: infillListView.activeIndex == index ? UM.Theme.colors.setting_control_text : UM.Theme.colors.setting_control_border color: infillListView.activeIndex == index ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_border")
text: name text: name
} }
} }
@ -173,25 +181,25 @@ Item
Rectangle { Rectangle {
id: helpersCellLeft id: helpersCellLeft
anchors.top: infillCellRight.bottom anchors.top: infillCellRight.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.left: parent.left anchors.left: parent.left
width: parent.width/100*35 - UM.Theme.sizes.default_margin.width width: parent.width/100*35 - UM.Theme.getSize("default_margin").width
height: childrenRect.height height: childrenRect.height
Label{ Label{
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.sizes.default_margin.width anchors.leftMargin: UM.Theme.getSize("default_margin").width
//: Helpers selection label //: Helpers selection label
text: catalog.i18nc("@label:listbox","Helpers:"); text: catalog.i18nc("@label:listbox","Helpers:");
font: UM.Theme.fonts.default; font: UM.Theme.getFont("default");
color: UM.Theme.colors.text; color: UM.Theme.getColor("text");
} }
} }
Rectangle { Rectangle {
id: helpersCellRight id: helpersCellRight
anchors.top: helpersCellLeft.top anchors.top: helpersCellLeft.top
anchors.left: helpersCellLeft.right anchors.left: helpersCellLeft.right
width: parent.width/100*65 - UM.Theme.sizes.default_margin.width width: parent.width/100*65 - UM.Theme.getSize("default_margin").width
height: childrenRect.height height: childrenRect.height
CheckBox{ CheckBox{
@ -211,8 +219,7 @@ Item
hoverEnabled: true hoverEnabled: true
onClicked: onClicked:
{ {
parent.checked = !parent.checked UM.MachineManager.setSettingValue("adhesion_type", !parent.checked?"brim":"skirt")
UM.MachineManager.setSettingValue("adhesion_type", parent.checked?"brim":"skirt")
} }
onEntered: onEntered:
{ {
@ -232,7 +239,7 @@ Item
property bool hovered_ex: false property bool hovered_ex: false
anchors.top: brimCheckBox.bottom anchors.top: brimCheckBox.bottom
anchors.topMargin: UM.Theme.sizes.default_margin.height anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.left: parent.left anchors.left: parent.left
//: Setting enable support checkbox //: Setting enable support checkbox
@ -245,8 +252,7 @@ Item
hoverEnabled: true hoverEnabled: true
onClicked: onClicked:
{ {
parent.checked = !parent.checked UM.MachineManager.setSettingValue("support_enable", !parent.checked)
UM.MachineManager.setSettingValue("support_enable", parent.checked)
} }
onEntered: onEntered:
{ {

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