Merge branch 'master' of github.com:ultimaker/Cura into feature_material_editing

* 'master' of github.com:ultimaker/Cura: (76 commits)
  Added UMO upgrade selection
  Added stubs for UMO upgrade selection
  Machine action labels are now translatable
  Code style CURA-1676
  Using the correct placeholder
  SplashScreen: Using system-default fontfamily
  USBPrinting: Let's "Print via USB"
  BQ Hephestos2 - Preheating temperature fix When starting a print with the "custom" GCode by BQ, the printer resets the nozzle temperature to 210°C when printing via SD card (no matter what you set on Cura) and only preheats the nozzle to 180°C when printing via USB. So currently the printer begins to print via USB at 180°C and reaches the correct temperature eg.g while printing the brim.
  Fix warning about missing color in theme
  Automatically show the Print Monitor when starting a print
  Fix USBPrinterOutputDevice to work with the Print Monitor
  Properly prevent warning when no printer is connected.
  ZOffset decorator is now correctly copied
  Force focus instead of requesting it.
  Fix two "critical errors" on startup
  Minor check machine action GUI improvements
  Prevent warning when no printer is connected.
  Fix empty material/quality profiles when switching variants
  Disable monitor buttons when there is no job running
  Move message stack "above" the viewport overlay
  ...
This commit is contained in:
Arjen Hiemstra 2016-07-04 11:45:59 +02:00
commit 7008e047f6
40 changed files with 1878 additions and 5629 deletions

View file

@ -0,0 +1,18 @@
from PyQt5.QtGui import QImage
from PyQt5.QtQuick import QQuickImageProvider
from PyQt5.QtCore import QSize
from UM.Application import Application
class CameraImageProvider(QQuickImageProvider):
def __init__(self):
QQuickImageProvider.__init__(self, QQuickImageProvider.Image)
## Request a new image.
def requestImage(self, id, size):
for output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices():
try:
return output_device.getCameraImage(), QSize(15, 15)
except AttributeError:
pass
return QImage(), QSize(15, 15)

View file

@ -144,6 +144,8 @@ class ConvexHullDecorator(SceneNodeDecorator):
else: else:
rounded_hull = None rounded_hull = None
mesh = None
world_transform = None
if self._node.getMeshData(): if self._node.getMeshData():
mesh = self._node.getMeshData() mesh = self._node.getMeshData()
world_transform = self._node.getWorldTransformation() world_transform = self._node.getWorldTransformation()

View file

@ -44,6 +44,7 @@ from . import ZOffsetDecorator
from . import CuraSplashScreen from . import CuraSplashScreen
from . import MachineManagerModel from . import MachineManagerModel
from . import ContainerSettingsModel from . import ContainerSettingsModel
from . import CameraImageProvider
from . import MachineActionManager from . import MachineActionManager
from . import ContainerManager from . import ContainerManager
@ -124,7 +125,6 @@ class CuraApplication(QtApplication):
self._platform = None self._platform = None
self._output_devices = {} self._output_devices = {}
self._print_information = None self._print_information = None
self._i18n_catalog = None
self._previous_active_tool = None self._previous_active_tool = None
self._platform_activity = False self._platform_activity = False
self._scene_bounding_box = AxisAlignedBox.Null self._scene_bounding_box = AxisAlignedBox.Null
@ -135,12 +135,16 @@ class CuraApplication(QtApplication):
self._cura_actions = None self._cura_actions = None
self._started = False self._started = False
self._i18n_catalog = i18nCatalog("cura")
self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity)
self.getController().toolOperationStopped.connect(self._onToolOperationStopped) self.getController().toolOperationStopped.connect(self._onToolOperationStopped)
Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.QmlFiles, "qml")
Resources.addType(self.ResourceTypes.Firmware, "firmware") Resources.addType(self.ResourceTypes.Firmware, "firmware")
self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading machines..."))
## Add the 4 types of profiles to storage. ## Add the 4 types of profiles to storage.
Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality")
Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants")
@ -229,7 +233,7 @@ class CuraApplication(QtApplication):
JobQueue.getInstance().jobFinished.connect(self._onJobFinished) JobQueue.getInstance().jobFinished.connect(self._onJobFinished)
self.applicationShuttingDown.connect(self.saveSettings) self.applicationShuttingDown.connect(self.saveSettings)
self.engineCreatedSignal.connect(self._onEngineCreated)
self._recent_files = [] self._recent_files = []
files = Preferences.getInstance().getValue("cura/recent_files").split(";") files = Preferences.getInstance().getValue("cura/recent_files").split(";")
for f in files: for f in files:
@ -238,6 +242,11 @@ class CuraApplication(QtApplication):
self._recent_files.append(QUrl.fromLocalFile(f)) self._recent_files.append(QUrl.fromLocalFile(f))
def _onEngineCreated(self):
self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider())
showPrintMonitor = pyqtSignal(bool, arguments = ["show"])
## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently. ## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently.
# #
# Note that the AutoSave plugin also calls this method. # Note that the AutoSave plugin also calls this method.
@ -327,13 +336,6 @@ class CuraApplication(QtApplication):
parser.add_argument("--debug", dest="debug-mode", action="store_true", default=False, help="Enable detailed crash reports.") parser.add_argument("--debug", dest="debug-mode", action="store_true", default=False, help="Enable detailed crash reports.")
def run(self): def run(self):
self._i18n_catalog = i18nCatalog("cura");
i18nCatalog.setTagReplacements({
"filename": "font color=\"black\"",
"message": "font color=UM.Theme.colors.message_text;",
})
self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene..."))
controller = self.getController() controller = self.getController()
@ -554,12 +556,12 @@ class CuraApplication(QtApplication):
for _ in range(count): for _ in range(count):
if node.getParent() and node.getParent().callDecoration("isGroup"): if node.getParent() and node.getParent().callDecoration("isGroup"):
new_node = copy.deepcopy(node.getParent()) #Copy the group node. new_node = copy.deepcopy(node.getParent()) #Copy the group node.
new_node.callDecoration("setConvexHull",None) new_node.callDecoration("recomputeConvexHull")
op.addOperation(AddSceneNodeOperation(new_node,node.getParent().getParent())) op.addOperation(AddSceneNodeOperation(new_node,node.getParent().getParent()))
else: else:
new_node = copy.deepcopy(node) new_node = copy.deepcopy(node)
new_node.callDecoration("setConvexHull", None) new_node.callDecoration("recomputeConvexHull")
op.addOperation(AddSceneNodeOperation(new_node, node.getParent())) op.addOperation(AddSceneNodeOperation(new_node, node.getParent()))
op.push() op.push()
@ -817,3 +819,7 @@ class CuraApplication(QtApplication):
def _addProfileWriter(self, profile_writer): def _addProfileWriter(self, profile_writer):
pass pass
@pyqtSlot("QSize")
def setMinimumWindowSize(self, size):
self.getMainWindow().setMinimumSize(size)

View file

@ -25,10 +25,13 @@ class CuraSplashScreen(QSplashScreen):
if buildtype: if buildtype:
version[0] += " (%s)" %(buildtype) version[0] += " (%s)" %(buildtype)
painter.setFont(QFont("Proxima Nova Rg", 20 )) font = QFont() # Using system-default font here
font.setPointSize(20)
painter.setFont(font)
painter.drawText(0, 0, 330 * self._scale, 230 * self._scale, Qt.AlignHCenter | Qt.AlignBottom, version[0]) painter.drawText(0, 0, 330 * self._scale, 230 * self._scale, Qt.AlignHCenter | Qt.AlignBottom, version[0])
if len(version) > 1: if len(version) > 1:
painter.setFont(QFont("Proxima Nova Rg", 12 )) font.setPointSize(12)
painter.setFont(font)
painter.drawText(0, 0, 330 * self._scale, 255 * self._scale, Qt.AlignHCenter | Qt.AlignBottom, version[1]) painter.drawText(0, 0, 330 * self._scale, 255 * self._scale, Qt.AlignHCenter | Qt.AlignBottom, version[1])
painter.restore() painter.restore()

View file

@ -84,8 +84,8 @@ class MachineManagerModel(QObject):
self._global_stack_valid = False self._global_stack_valid = False
self.globalValidationChanged.emit() self.globalValidationChanged.emit()
else: else:
new_validation_state = self._checkStackForErrors(self._active_container_stack) has_errors = self._checkStackForErrors(self._active_container_stack)
if new_validation_state: if not has_errors:
self._global_stack_valid = True self._global_stack_valid = True
self.globalValidationChanged.emit() self.globalValidationChanged.emit()
@ -104,6 +104,7 @@ class MachineManagerModel(QObject):
self._global_stack_valid = not self._checkStackForErrors(self._global_container_stack) self._global_stack_valid = not self._checkStackForErrors(self._global_container_stack)
def _onActiveExtruderStackChanged(self): def _onActiveExtruderStackChanged(self):
self.blurSettings.emit() # Ensure no-one has focus.
if self._active_container_stack and self._active_container_stack != self._global_container_stack: if self._active_container_stack and self._active_container_stack != self._global_container_stack:
self._active_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) self._active_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged)
self._active_container_stack.propertyChanged.disconnect(self._onGlobalPropertyChanged) self._active_container_stack.propertyChanged.disconnect(self._onGlobalPropertyChanged)
@ -202,7 +203,7 @@ class MachineManagerModel(QObject):
@pyqtProperty(bool, notify = activeStackChanged) @pyqtProperty(bool, notify = activeStackChanged)
def hasUserSettings(self): def hasUserSettings(self):
if not self._active_container_stack: if not self._active_container_stack:
return return False
user_settings = self._active_container_stack.getTop().findInstances(**{}) user_settings = self._active_container_stack.getTop().findInstances(**{})
return len(user_settings) != 0 return len(user_settings) != 0
@ -212,7 +213,7 @@ class MachineManagerModel(QObject):
# Calling _checkStackForErrors on every change is simply too expensive # Calling _checkStackForErrors on every change is simply too expensive
@pyqtProperty(bool, notify = globalValidationChanged) @pyqtProperty(bool, notify = globalValidationChanged)
def isGlobalStackValid(self): def isGlobalStackValid(self):
return self._global_stack_valid return bool(self._global_stack_valid)
@pyqtProperty(str, notify = activeStackChanged) @pyqtProperty(str, notify = activeStackChanged)
def activeUserProfileId(self): def activeUserProfileId(self):
@ -285,7 +286,7 @@ class MachineManagerModel(QObject):
self.blurSettings.emit() self.blurSettings.emit()
self.setActiveQuality(new_container_id) self.setActiveQuality(new_container_id)
self.updateQualityContainerFromUserContainer() self.updateQualityContainerFromUserContainer()
return new_container_id
@pyqtSlot(str, result=str) @pyqtSlot(str, result=str)
def duplicateContainer(self, container_id): def duplicateContainer(self, container_id):
@ -357,7 +358,6 @@ class MachineManagerModel(QObject):
self.setActiveQuality(containers[0].getId()) self.setActiveQuality(containers[0].getId())
self.activeQualityChanged.emit() self.activeQualityChanged.emit()
@pyqtSlot() @pyqtSlot()
def updateQualityContainerFromUserContainer(self): def updateQualityContainerFromUserContainer(self):
if not self._active_container_stack: if not self._active_container_stack:
@ -401,9 +401,9 @@ class MachineManagerModel(QObject):
preferred_material = None preferred_material = None
if old_material: if old_material:
preferred_material = old_material.getId() preferred_material_name = old_material.getName()
self.setActiveMaterial(self._updateMaterialContainer(self._global_container_stack.getBottom(), containers[0], preferred_material).id) self.setActiveMaterial(self._updateMaterialContainer(self._global_container_stack.getBottom(), containers[0], preferred_material_name).id)
@pyqtSlot(str) @pyqtSlot(str)
def setActiveQuality(self, quality_id): def setActiveQuality(self, quality_id):
@ -496,6 +496,12 @@ class MachineManagerModel(QObject):
return False return False
@pyqtSlot(str, result = str)
def getDefinitionByMachineId(self, machine_id):
containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id=machine_id)
if containers:
return containers[0].getBottom().getId()
def _updateVariantContainer(self, definition): def _updateVariantContainer(self, definition):
if not definition.getMetaDataEntry("has_variants"): if not definition.getMetaDataEntry("has_variants"):
return self._empty_variant_container return self._empty_variant_container
@ -513,7 +519,7 @@ class MachineManagerModel(QObject):
return self._empty_variant_container return self._empty_variant_container
def _updateMaterialContainer(self, definition, variant_container = None, preferred_material = None): def _updateMaterialContainer(self, definition, variant_container = None, preferred_material_name = None):
if not definition.getMetaDataEntry("has_materials"): if not definition.getMetaDataEntry("has_materials"):
return self._empty_material_container return self._empty_material_container
@ -527,15 +533,26 @@ class MachineManagerModel(QObject):
else: else:
search_criteria["definition"] = "fdmprinter" search_criteria["definition"] = "fdmprinter"
if not preferred_material: if preferred_material_name:
search_criteria["name"] = preferred_material_name
else:
preferred_material = definition.getMetaDataEntry("preferred_material") preferred_material = definition.getMetaDataEntry("preferred_material")
if preferred_material: if preferred_material:
search_criteria["id"] = preferred_material search_criteria["id"] = preferred_material
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria)
if containers: if containers:
return containers[0] return containers[0]
if "name" in search_criteria or "id" in search_criteria:
# If a material by this name can not be found, try a wider set of search criteria
search_criteria.pop("name", None)
search_criteria.pop("id", None)
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria)
if containers:
return containers[0]
return self._empty_material_container return self._empty_material_container
def _updateQualityContainer(self, definition, material_container = None, preferred_quality_name = None): def _updateQualityContainer(self, definition, material_container = None, preferred_quality_name = None):
@ -560,6 +577,15 @@ class MachineManagerModel(QObject):
if containers: if containers:
return containers[0] return containers[0]
if "name" in search_criteria or "id" in search_criteria:
# If a quality by this name can not be found, try a wider set of search criteria
search_criteria.pop("name", None)
search_criteria.pop("id", None)
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria)
if containers:
return containers[0]
return self._empty_quality_container return self._empty_quality_container
def createMachineManagerModel(engine, script_engine): def createMachineManagerModel(engine, script_engine):

View file

@ -7,7 +7,6 @@ from UM.Scene.SceneNode import SceneNode
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
from UM.Math.Vector import Vector from UM.Math.Vector import Vector
from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Math.AxisAlignedBox import AxisAlignedBox
from UM.Application import Application
from UM.Scene.Selection import Selection from UM.Scene.Selection import Selection
from UM.Preferences import Preferences from UM.Preferences import Preferences
@ -16,8 +15,6 @@ from cura.ConvexHullDecorator import ConvexHullDecorator
from . import PlatformPhysicsOperation from . import PlatformPhysicsOperation
from . import ZOffsetDecorator from . import ZOffsetDecorator
import copy
class PlatformPhysics: class PlatformPhysics:
def __init__(self, controller, volume): def __init__(self, controller, volume):
super().__init__() super().__init__()
@ -100,18 +97,15 @@ class PlatformPhysics:
# continue # continue
# Get the overlap distance for both convex hulls. If this returns None, there is no intersection. # Get the overlap distance for both convex hulls. If this returns None, there is no intersection.
try: head_hull = node.callDecoration("getConvexHullHead")
head_hull = node.callDecoration("getConvexHullHead") if head_hull:
if head_hull: overlap = head_hull.intersectsPolygon(other_node.callDecoration("getConvexHull"))
overlap = head_hull.intersectsPolygon(other_node.callDecoration("getConvexHull")) if not overlap:
if not overlap: other_head_hull = other_node.callDecoration("getConvexHullHead")
other_head_hull = other_node.callDecoration("getConvexHullHead") if other_head_hull:
if other_head_hull: overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_head_hull)
overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_head_hull) else:
else: overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull"))
overlap = node.callDecoration("getConvexHull").intersectsPolygon(other_node.callDecoration("getConvexHull"))
except:
overlap = None #It can sometimes occur that the calculated convex hull has no size, in which case there is no overlap.
if overlap is None: if overlap is None:
continue continue

View file

@ -29,6 +29,10 @@ class PrinterOutputDevice(QObject, OutputDevice):
self._head_y = 0 self._head_y = 0
self._head_z = 0 self._head_z = 0
self._connection_state = ConnectionState.closed self._connection_state = ConnectionState.closed
self._time_elapsed = 0
self._time_total = 0
self._job_state = ""
self._job_name = ""
def requestWrite(self, node, file_name = None, filter_by_machine = False): def requestWrite(self, node, file_name = None, filter_by_machine = False):
raise NotImplementedError("requestWrite needs to be implemented") raise NotImplementedError("requestWrite needs to be implemented")
@ -57,6 +61,39 @@ class PrinterOutputDevice(QObject, OutputDevice):
# it also sends it's own device_id (for convenience sake) # it also sends it's own device_id (for convenience sake)
connectionStateChanged = pyqtSignal(str) connectionStateChanged = pyqtSignal(str)
timeElapsedChanged = pyqtSignal()
timeTotalChanged = pyqtSignal()
jobStateChanged = pyqtSignal()
jobNameChanged = pyqtSignal()
@pyqtProperty(str, notify = jobStateChanged)
def jobState(self):
return self._job_state
def _updateJobState(self, job_state):
if self._job_state != job_state:
self._job_state = job_state
self.jobStateChanged.emit()
@pyqtSlot(str)
def setJobState(self, job_state):
self._setJobState(job_state)
def _setJobState(self, job_state):
Logger.log("w", "_setJobState is not implemented by this output device")
@pyqtProperty(str, notify = jobNameChanged)
def jobName(self):
return self._job_name
def setJobName(self, name):
if self._job_name != name:
self._job_name = name
self.jobNameChanged.emit()
## Get the bed temperature of the bed (if any) ## Get the bed temperature of the bed (if any)
# This function is "final" (do not re-implement) # This function is "final" (do not re-implement)
# /sa _getBedTemperature implementation function # /sa _getBedTemperature implementation function
@ -74,6 +111,30 @@ class PrinterOutputDevice(QObject, OutputDevice):
self._target_bed_temperature = temperature self._target_bed_temperature = temperature
self.targetBedTemperatureChanged.emit() self.targetBedTemperatureChanged.emit()
## Time the print has been printing.
# Note that timeTotal - timeElapsed should give time remaining.
@pyqtProperty(float, notify = timeElapsedChanged)
def timeElapsed(self):
return self._time_elapsed
## Total time of the print
# Note that timeTotal - timeElapsed should give time remaining.
@pyqtProperty(float, notify=timeTotalChanged)
def timeTotal(self):
return self._time_total
@pyqtSlot(float)
def setTimeTotal(self, new_total):
if self._time_total != new_total:
self._time_total = new_total
self.timeTotalChanged.emit()
@pyqtSlot(float)
def setTimeElapsed(self, time_elapsed):
if self._time_elapsed != time_elapsed:
self._time_elapsed = time_elapsed
self.timeElapsedChanged.emit()
## Home the head of the connected printer ## Home the head of the connected printer
# This function is "final" (do not re-implement) # This function is "final" (do not re-implement)
# /sa _homeHead implementation function # /sa _homeHead implementation function

View file

@ -10,3 +10,8 @@ class ZOffsetDecorator(SceneNodeDecorator):
def getZOffset(self): def getZOffset(self):
return self._z_offset return self._z_offset
def __deepcopy__(self, memo):
copied_decorator = ZOffsetDecorator()
copied_decorator.setZOffset(self.getZOffset())
return copied_decorator

View file

@ -2,7 +2,7 @@
# Cura is released under the terms of the AGPLv3 or higher. # Cura is released under the terms of the AGPLv3 or higher.
from UM.Mesh.MeshReader import MeshReader from UM.Mesh.MeshReader import MeshReader
from UM.Mesh.MeshData import MeshData from UM.Mesh.MeshBuilder import MeshBuilder
from UM.Logger import Logger from UM.Logger import Logger
from UM.Math.Matrix import Matrix from UM.Math.Matrix import Matrix
from UM.Math.Vector import Vector from UM.Math.Vector import Vector
@ -42,7 +42,7 @@ class ThreeMFReader(MeshReader):
return None return None
for entry in objects: for entry in objects:
mesh = MeshData() mesh_builder = MeshBuilder()
node = SceneNode() node = SceneNode()
vertex_list = [] vertex_list = []
#for vertex in entry.mesh.vertices.vertex: #for vertex in entry.mesh.vertices.vertex:
@ -51,71 +51,67 @@ class ThreeMFReader(MeshReader):
Job.yieldThread() Job.yieldThread()
triangles = entry.findall(".//3mf:triangle", self._namespaces) triangles = entry.findall(".//3mf:triangle", self._namespaces)
mesh_builder.reserveFaceCount(len(triangles))
mesh.reserveFaceCount(len(triangles))
#for triangle in object.mesh.triangles.triangle: #for triangle in object.mesh.triangles.triangle:
for triangle in triangles: for triangle in triangles:
v1 = int(triangle.get("v1")) v1 = int(triangle.get("v1"))
v2 = int(triangle.get("v2")) v2 = int(triangle.get("v2"))
v3 = int(triangle.get("v3")) v3 = int(triangle.get("v3"))
mesh.addFace(vertex_list[v1][0],vertex_list[v1][1],vertex_list[v1][2],vertex_list[v2][0],vertex_list[v2][1],vertex_list[v2][2],vertex_list[v3][0],vertex_list[v3][1],vertex_list[v3][2])
mesh_builder.addFaceByPoints(vertex_list[v1][0], vertex_list[v1][1], vertex_list[v1][2],
vertex_list[v2][0], vertex_list[v2][1], vertex_list[v2][2],
vertex_list[v3][0], vertex_list[v3][1], vertex_list[v3][2])
Job.yieldThread() Job.yieldThread()
# Rotate the model; We use a different coordinate frame. # Rotate the model; We use a different coordinate frame.
rotation = Matrix() rotation = Matrix()
rotation.setByRotationAxis(-0.5 * math.pi, Vector(1,0,0)) rotation.setByRotationAxis(-0.5 * math.pi, Vector(1,0,0))
mesh = mesh.getTransformed(rotation)
#TODO: We currently do not check for normals and simply recalculate them. #TODO: We currently do not check for normals and simply recalculate them.
mesh.calculateNormals() mesh_builder.calculateNormals()
node.setMeshData(mesh)
node.setMeshData(mesh_builder.build().getTransformed(rotation))
node.setSelectable(True) node.setSelectable(True)
transformation = root.findall("./3mf:build/3mf:item[@objectid='{0}']".format(entry.get("id")), self._namespaces) transformations = root.findall("./3mf:build/3mf:item[@objectid='{0}']".format(entry.get("id")), self._namespaces)
if transformation: transformation = transformations[0] if transformations else None
transformation = transformation[0] if transformation is not None and transformation.get("transform"):
try: splitted_transformation = transformation.get("transform").split()
if transformation.get("transform"): ## Transformation is saved as:
splitted_transformation = transformation.get("transform").split() ## M00 M01 M02 0.0
## Transformation is saved as: ## M10 M11 M12 0.0
## M00 M01 M02 0.0 ## M20 M21 M22 0.0
## M10 M11 M12 0.0 ## M30 M31 M32 1.0
## M20 M21 M22 0.0 ## We switch the row & cols as that is how everyone else uses matrices!
## M30 M31 M32 1.0 temp_mat = Matrix()
## We switch the row & cols as that is how everyone else uses matrices! # Rotation & Scale
temp_mat = Matrix() temp_mat._data[0,0] = splitted_transformation[0]
# Rotation & Scale temp_mat._data[1,0] = splitted_transformation[1]
temp_mat._data[0,0] = splitted_transformation[0] temp_mat._data[2,0] = splitted_transformation[2]
temp_mat._data[1,0] = splitted_transformation[1] temp_mat._data[0,1] = splitted_transformation[3]
temp_mat._data[2,0] = splitted_transformation[2] temp_mat._data[1,1] = splitted_transformation[4]
temp_mat._data[0,1] = splitted_transformation[3] temp_mat._data[2,1] = splitted_transformation[5]
temp_mat._data[1,1] = splitted_transformation[4] temp_mat._data[0,2] = splitted_transformation[6]
temp_mat._data[2,1] = splitted_transformation[5] temp_mat._data[1,2] = splitted_transformation[7]
temp_mat._data[0,2] = splitted_transformation[6] temp_mat._data[2,2] = splitted_transformation[8]
temp_mat._data[1,2] = splitted_transformation[7]
temp_mat._data[2,2] = splitted_transformation[8]
# Translation # Translation
temp_mat._data[0,3] = splitted_transformation[9] temp_mat._data[0,3] = splitted_transformation[9]
temp_mat._data[1,3] = splitted_transformation[10] temp_mat._data[1,3] = splitted_transformation[10]
temp_mat._data[2,3] = splitted_transformation[11] temp_mat._data[2,3] = splitted_transformation[11]
node.setTransformation(temp_mat) node.setTransformation(temp_mat)
except AttributeError:
pass # Empty list was found. Getting transformation is not possible
result.addChild(node) result.addChild(node)
Job.yieldThread() Job.yieldThread()
#If there is more then one object, group them. #If there is more then one object, group them.
try: if len(objects) > 1:
if len(objects) > 1: group_decorator = GroupDecorator()
group_decorator = GroupDecorator() result.addDecorator(group_decorator)
result.addDecorator(group_decorator)
except:
pass
except Exception as e: except Exception as e:
Logger.log("e" ,"exception occured in 3mf reader: %s" , e) Logger.log("e" ,"exception occured in 3mf reader: %s" , e)

View file

@ -1,72 +0,0 @@
// Copyright (c) 2015 Ultimaker B.V.
// Cura is released under the terms of the AGPLv3 or higher.
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import QtQuick.Window 2.1
import UM 1.1 as UM
UM.Dialog
{
width: 500 * Screen.devicePixelRatio;
height: 100 * Screen.devicePixelRatio;
modality: Qt.NonModal
title: catalog.i18nc("@title:window", "Print with USB")
Column
{
anchors.fill: parent;
Row
{
spacing: UM.Theme.getSize("default_margin").width;
Label
{
//: USB Printing dialog label, %1 is head temperature
text: catalog.i18nc("@label","Extruder Temperature %1").arg(manager.hotendTemperatures[0])
}
Label
{
//: USB Printing dialog label, %1 is bed temperature
text: catalog.i18nc("@label","Bed Temperature %1").arg(manager.bedTemperature)
}
Label
{
text: "" + manager.error
}
UM.I18nCatalog{id: catalog; name:"cura"}
}
ProgressBar
{
id: prog;
anchors.left: parent.left;
anchors.right: parent.right;
minimumValue: 0;
maximumValue: 100;
value: manager.progress
}
}
rightButtons: [
Button
{
//: USB Printing dialog start print button
text: catalog.i18nc("@action:button","Print");
onClicked: { manager.startPrint() }
enabled: manager.progress == 0 ? true : false
},
Button
{
//: USB Printing dialog cancel print button
text: catalog.i18nc("@action:button","Cancel");
onClicked: { manager.cancelPrint() }
enabled: manager.progress == 0 ? false: true
}
]
}

View file

@ -26,8 +26,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
def __init__(self, serial_port): def __init__(self, serial_port):
super().__init__(serial_port) super().__init__(serial_port)
self.setName(catalog.i18nc("@item:inmenu", "USB printing")) self.setName(catalog.i18nc("@item:inmenu", "USB printing"))
self.setShortDescription(catalog.i18nc("@action:button", "Print with USB")) self.setShortDescription(catalog.i18nc("@action:button", "Print via USB"))
self.setDescription(catalog.i18nc("@info:tooltip", "Print with USB")) self.setDescription(catalog.i18nc("@info:tooltip", "Print via USB"))
self.setIconName("print") self.setIconName("print")
self._serial = None self._serial = None
@ -51,13 +51,14 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self._update_firmware_thread = threading.Thread(target= self._updateFirmware) self._update_firmware_thread = threading.Thread(target= self._updateFirmware)
self._update_firmware_thread.daemon = True self._update_firmware_thread.daemon = True
self.firmwareUpdateComplete.connect(self._onFirmwareUpdateComplete) self.firmwareUpdateComplete.connect(self._onFirmwareUpdateComplete)
self._heatup_wait_start_time = time.time() self._heatup_wait_start_time = time.time()
## Queue for commands that need to be send. Used when command is sent when a print is active. ## Queue for commands that need to be send. Used when command is sent when a print is active.
self._command_queue = queue.Queue() self._command_queue = queue.Queue()
self._is_printing = False self._is_printing = False
self._is_paused = False
## Set when print is started in order to check running time. ## Set when print is started in order to check running time.
self._print_start_time = None self._print_start_time = None
@ -80,13 +81,15 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
# In order to keep the connection alive we request the temperature every so often from a different extruder. # In order to keep the connection alive we request the temperature every so often from a different extruder.
# This index is the extruder we requested data from the last time. # This index is the extruder we requested data from the last time.
self._temperature_requested_extruder_index = 0 self._temperature_requested_extruder_index = 0
self._current_z = 0
self._updating_firmware = False self._updating_firmware = False
self._firmware_file_name = None self._firmware_file_name = None
self._control_view = None self._error_message = None
onError = pyqtSignal() onError = pyqtSignal()
@ -120,10 +123,10 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
def _homeBed(self): def _homeBed(self):
self._sendCommand("G28 Z") self._sendCommand("G28 Z")
@pyqtSlot()
def startPrint(self): def startPrint(self):
self.writeStarted.emit(self) self.writeStarted.emit(self)
gcode_list = getattr( Application.getInstance().getController().getScene(), "gcode_list") gcode_list = getattr( Application.getInstance().getController().getScene(), "gcode_list")
self._updateJobState("printing")
self.printGCode(gcode_list) self.printGCode(gcode_list)
def _moveHead(self, x, y, z, speed): def _moveHead(self, x, y, z, speed):
@ -135,6 +138,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
# \param gcode_list List with gcode (strings). # \param gcode_list List with gcode (strings).
def printGCode(self, gcode_list): def printGCode(self, gcode_list):
if self._progress or self._connection_state != ConnectionState.connected: if self._progress or self._connection_state != ConnectionState.connected:
self._error_message = Message(i18n_catalog.i18nc("@info:status", "Printer is busy or not connected. Unable to start a new job."))
self._error_message.show()
Logger.log("d", "Printer is busy or not connected, aborting print") Logger.log("d", "Printer is busy or not connected, aborting print")
self.writeError.emit(self) self.writeError.emit(self)
return return
@ -344,23 +349,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self._setErrorState("Unexpected error while writing serial port %s " % e) self._setErrorState("Unexpected error while writing serial port %s " % e)
self.close() self.close()
def createControlInterface(self): ## Send a command to printer.
if self._control_view is None:
Logger.log("d", "Creating control interface for printer connection")
path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "ControlWindow.qml"))
component = QQmlComponent(Application.getInstance()._engine, path)
self._control_context = QQmlContext(Application.getInstance()._engine.rootContext())
self._control_context.setContextProperty("manager", self)
self._control_view = component.create(self._control_context)
## Show control interface.
# This will create the view if its not already created.
def showControlInterface(self):
if self._control_view is None:
self.createControlInterface()
self._control_view.show()
## Send a command to printer.
# \param cmd string with g-code # \param cmd string with g-code
def sendCommand(self, cmd): def sendCommand(self, cmd):
if self._progress: if self._progress:
@ -371,11 +360,13 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
## Set the error state with a message. ## Set the error state with a message.
# \param error String with the error message. # \param error String with the error message.
def _setErrorState(self, error): def _setErrorState(self, error):
self._updateJobState("error")
self._error_state = error self._error_state = error
self.onError.emit() self.onError.emit()
def requestWrite(self, node, file_name = None, filter_by_machine = False): def requestWrite(self, node, file_name = None, filter_by_machine = False):
self.showControlInterface() Application.getInstance().showPrintMonitor.emit(True)
self.startPrint()
def _setEndstopState(self, endstop_key, value): def _setEndstopState(self, endstop_key, value):
if endstop_key == b"x_min": if endstop_key == b"x_min":
@ -391,14 +382,14 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self.endstopStateChanged.emit("z_min", value) self.endstopStateChanged.emit("z_min", value)
self._z_min_endstop_pressed = value self._z_min_endstop_pressed = value
## Listen thread function. ## Listen thread function.
def _listen(self): def _listen(self):
Logger.log("i", "Printer connection listen thread started for %s" % self._serial_port) Logger.log("i", "Printer connection listen thread started for %s" % self._serial_port)
temperature_request_timeout = time.time() temperature_request_timeout = time.time()
ok_timeout = time.time() ok_timeout = time.time()
while self._connection_state == ConnectionState.connected: while self._connection_state == ConnectionState.connected:
line = self._readline() line = self._readline()
if line is None: if line is None:
break # None is only returned when something went wrong. Stop listening break # None is only returned when something went wrong. Stop listening
if time.time() > temperature_request_timeout: if time.time() > temperature_request_timeout:
@ -423,7 +414,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self._setErrorState(line[6:]) self._setErrorState(line[6:])
elif b" T:" in line or line.startswith(b"T:"): # Temperature message elif b" T:" in line or line.startswith(b"T:"): # Temperature message
try: try:
self._setHotendTemperature(self._temperature_requested_extruder_index, float(re.search(b"T: *([0-9\.]*)", line).group(1))) self._setHotendTemperature(self._temperature_requested_extruder_index, float(re.search(b"T: *([0-9\.]*)", line).group(1)))
except: except:
pass pass
@ -445,6 +436,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
ok_timeout = time.time() + 5 ok_timeout = time.time() + 5
if not self._command_queue.empty(): if not self._command_queue.empty():
self._sendCommand(self._command_queue.get()) self._sendCommand(self._command_queue.get())
elif self._is_paused:
line = b"" # Force getting temperature as keep alive
else: else:
self._sendNextGcodeLine() self._sendNextGcodeLine()
elif b"resend" in line.lower() or b"rs" in line: # Because a resend can be asked with "resend" and "rs" elif b"resend" in line.lower() or b"rs" in line: # Because a resend can be asked with "resend" and "rs"
@ -454,13 +447,14 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
if b"rs" in line: if b"rs" in line:
self._gcode_position = int(line.split()[1]) self._gcode_position = int(line.split()[1])
else: # Request the temperature on comm timeout (every 2 seconds) when we are not printing.) # Request the temperature on comm timeout (every 2 seconds) when we are not printing.)
if line == b"": if line == b"":
if self._num_extruders > 0: if self._num_extruders > 0:
self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._num_extruders self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._num_extruders
self.sendCommand("M105 T%d" % self._temperature_requested_extruder_index) self.sendCommand("M105 T%d" % self._temperature_requested_extruder_index)
else: else:
self.sendCommand("M105") self.sendCommand("M105")
Logger.log("i", "Printer connection listen thread stopped for %s" % self._serial_port) Logger.log("i", "Printer connection listen thread stopped for %s" % self._serial_port)
## Send next Gcode in the gcode list ## Send next Gcode in the gcode list
@ -487,10 +481,22 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
checksum = functools.reduce(lambda x,y: x^y, map(ord, "N%d%s" % (self._gcode_position, line))) checksum = functools.reduce(lambda x,y: x^y, map(ord, "N%d%s" % (self._gcode_position, line)))
self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum)) self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum))
self._gcode_position += 1 self._gcode_position += 1
self.setProgress((self._gcode_position / len(self._gcode)) * 100) self.setProgress((self._gcode_position / len(self._gcode)) * 100)
self.progressChanged.emit() self.progressChanged.emit()
## Set the state of the print.
# Sent from the print monitor
def _setJobState(self, job_state):
if job_state == "pause":
self._is_paused = True
self._updateJobState("paused")
elif job_state == "print":
self._is_paused = False
self._updateJobState("printing")
elif job_state == "abort":
self.cancelPrint()
## Set the progress of the print. ## Set the progress of the print.
# It will be normalized (based on max_progress) to range 0 - 100 # It will be normalized (based on max_progress) to range 0 - 100
def setProgress(self, progress, max_progress = 100): def setProgress(self, progress, max_progress = 100):
@ -498,16 +504,20 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self.progressChanged.emit() self.progressChanged.emit()
## Cancel the current print. Printer connection wil continue to listen. ## Cancel the current print. Printer connection wil continue to listen.
@pyqtSlot()
def cancelPrint(self): def cancelPrint(self):
self._gcode_position = 0 self._gcode_position = 0
self.setProgress(0) self.setProgress(0)
self._gcode = [] self._gcode = []
# Turn of temperatures # Turn off temperatures, fan and steppers
self._sendCommand("M140 S0") self._sendCommand("M140 S0")
self._sendCommand("M104 S0") self._sendCommand("M104 S0")
self._sendCommand("M107")
self._sendCommand("M84")
self._is_printing = False self._is_printing = False
self._is_paused = False
self._updateJobState("ready")
Application.getInstance().showPrintMonitor.emit(False)
## Check if the process did not encounter an error yet. ## Check if the process did not encounter an error yet.
def hasError(self): def hasError(self):

View file

@ -1,14 +1,16 @@
from cura.MachineAction import MachineAction from cura.MachineAction import MachineAction
from cura.PrinterOutputDevice import PrinterOutputDevice
from PyQt5.QtCore import pyqtSlot from PyQt5.QtCore import pyqtSlot
from UM.Application import Application from UM.Application import Application
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
from cura.PrinterOutputDevice import PrinterOutputDevice
class BedLevelMachineAction(MachineAction): class BedLevelMachineAction(MachineAction):
def __init__(self): def __init__(self):
super().__init__("BedLevel", "Level bed") super().__init__("BedLevel", catalog.i18nc("@action", "Level bed"))
self._qml_url = "BedLevelMachineAction.qml" self._qml_url = "BedLevelMachineAction.qml"
self._bed_level_position = 0 self._bed_level_position = 0

View file

@ -3,9 +3,13 @@ from cura.PrinterOutputDevice import PrinterOutputDevice
from UM.Application import Application from UM.Application import Application
from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
class UMOCheckupMachineAction(MachineAction): class UMOCheckupMachineAction(MachineAction):
def __init__(self): def __init__(self):
super().__init__("UMOCheckup", "Checkup") super().__init__("UMOCheckup", catalog.i18nc("@action", "Checkup"))
self._qml_url = "UMOCheckupMachineAction.qml" self._qml_url = "UMOCheckupMachineAction.qml"
self._hotend_target_temp = 180 self._hotend_target_temp = 180
self._bed_target_temp = 60 self._bed_target_temp = 60

View file

@ -52,7 +52,6 @@ Cura.MachineAction
onClicked: onClicked:
{ {
checkupContent.visible = true checkupContent.visible = true
startCheckButton.enabled = false
manager.startCheck() manager.startCheck()
} }
} }
@ -94,7 +93,7 @@ Cura.MachineAction
anchors.left: connectionLabel.right anchors.left: connectionLabel.right
anchors.top: parent.top anchors.top: parent.top
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
text: Cura.USBPrinterManager.connectedPrinterList.rowCount() > 0 || base.addOriginalProgress.checkUp[0] ? catalog.i18nc("@info:status","Done"):catalog.i18nc("@info:status","Incomplete") text: Cura.USBPrinterManager.connectedPrinterList.rowCount() > 0 ? catalog.i18nc("@info:status","Connected"): catalog.i18nc("@info:status","Not connected")
} }
////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////
Label Label

View file

@ -0,0 +1,47 @@
from cura.MachineAction import MachineAction
from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty
from UM.i18n import i18nCatalog
from UM.Application import Application
catalog = i18nCatalog("cura")
import UM.Settings.InstanceContainer
class UMOUpgradeSelection(MachineAction):
def __init__(self):
super().__init__("UMOUpgradeSelection", catalog.i18nc("@action", "Select upgrades"))
self._qml_url = "UMOUpgradeSelectionMachineAction.qml"
heatedBedChanged = pyqtSignal()
@pyqtProperty(bool, notify = heatedBedChanged)
def hasHeatedBed(self):
global_container_stack = Application.getInstance().getGlobalContainerStack()
return global_container_stack.getProperty("machine_heated_bed", "value")
@pyqtSlot()
def addHeatedBed(self):
global_container_stack = Application.getInstance().getGlobalContainerStack()
if global_container_stack:
variant = global_container_stack.findContainer({"type": "variant"})
if variant:
if variant.getId() == "empty_variant":
variant_index = global_container_stack.getContainerIndex(variant)
stack_name = global_container_stack.getName()
new_variant = UM.Settings.InstanceContainer(stack_name + "_variant")
new_variant.addMetaDataEntry("type", "variant")
new_variant.setDefinition(global_container_stack.getBottom())
UM.Settings.ContainerRegistry.getInstance().addContainer(new_variant)
global_container_stack.replaceContainer(variant_index, new_variant)
variant = new_variant
variant.setProperty("machine_heated_bed", "value", True)
self.heatedBedChanged.emit()
@pyqtSlot()
def removeHeatedBed(self):
global_container_stack = Application.getInstance().getGlobalContainerStack()
if global_container_stack:
variant = global_container_stack.findContainer({"type": "variant"})
if variant:
variant.setProperty("machine_heated_bed", "value", False)
self.heatedBedChanged.emit()

View file

@ -0,0 +1,39 @@
// Copyright (c) 2016 Ultimaker B.V.
// Cura is released under the terms of the AGPLv3 or higher.
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import QtQuick.Window 2.1
import UM 1.2 as UM
import Cura 1.0 as Cura
Cura.MachineAction
{
anchors.fill: parent;
Item
{
id: bedLevelMachineAction
anchors.fill: parent;
UM.I18nCatalog { id: catalog; name: "cura"; }
Column
{
anchors.fill: parent;
Label
{
width: parent.width
wrapMode: Text.WordWrap
text: catalog.i18nc("@label","Please select any upgrades made to this ultimaker original");
}
CheckBox
{
text: catalog.i18nc("@label", "Self-built heated bed")
checked: manager.hasHeatedBed
onClicked: manager.hasHeatedBed ? manager.removeHeatedBed() : manager.addHeatedBed()
}
}
}
}

View file

@ -1,6 +1,9 @@
from cura.MachineAction import MachineAction from cura.MachineAction import MachineAction
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
class UpgradeFirmwareMachineAction(MachineAction): class UpgradeFirmwareMachineAction(MachineAction):
def __init__(self): def __init__(self):
super().__init__("UpgradeFirmware", "Upgrade Firmware") super().__init__("UpgradeFirmware", catalog.i18nc("@action", "Upgrade Firmware"))
self._qml_url = "UpgradeFirmwareMachineAction.qml" self._qml_url = "UpgradeFirmwareMachineAction.qml"

View file

@ -4,6 +4,7 @@
from . import BedLevelMachineAction from . import BedLevelMachineAction
from . import UpgradeFirmwareMachineAction from . import UpgradeFirmwareMachineAction
from . import UMOCheckupMachineAction from . import UMOCheckupMachineAction
from . import UMOUpgradeSelection
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura") catalog = i18nCatalog("cura")
@ -20,4 +21,4 @@ def getMetaData():
} }
def register(app): def register(app):
return { "machine_action": [BedLevelMachineAction.BedLevelMachineAction(), UpgradeFirmwareMachineAction.UpgradeFirmwareMachineAction(), UMOCheckupMachineAction.UMOCheckupMachineAction()]} return { "machine_action": [BedLevelMachineAction.BedLevelMachineAction(), UpgradeFirmwareMachineAction.UpgradeFirmwareMachineAction(), UMOCheckupMachineAction.UMOCheckupMachineAction(), UMOUpgradeSelection.UMOUpgradeSelection()]}

View file

@ -14,7 +14,7 @@
}, },
"overrides": { "overrides": {
"machine_start_gcode": { "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" }, "machine_start_gcode": { "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\nM109 S{material_print_temperature} ;Makes sure the temperature is correct before printing\n; -- end of START GCODE --" },
"machine_end_gcode": { "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" }, "machine_end_gcode": { "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" },
"machine_width": { "default_value": 210 }, "machine_width": { "default_value": 210 },
"machine_depth": { "default_value": 297 }, "machine_depth": { "default_value": 297 },

View file

@ -29,19 +29,19 @@
{ {
"machine_show_variants": "machine_show_variants":
{ {
"label": "Show machine variants",
"description": "Whether to show the different variants of this machine, which are described in separate json files.", "description": "Whether to show the different variants of this machine, which are described in separate json files.",
"default_value": false, "default_value": false,
"type": "bool", "type": "bool",
"label": "Show machine variants",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_start_gcode": "machine_start_gcode":
{ {
"label": "Start GCode",
"description": "Gcode commands to be executed at the very start - separated by \\n.", "description": "Gcode commands to be executed at the very start - separated by \\n.",
"default_value": "G28 ;Home\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0", "default_value": "G28 ;Home\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0",
"label": "Start GCode",
"type": "str", "type": "str",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
@ -49,9 +49,9 @@
}, },
"machine_end_gcode": "machine_end_gcode":
{ {
"label": "End GCode",
"description": "Gcode commands to be executed at the very end - separated by \\n.", "description": "Gcode commands to be executed at the very end - separated by \\n.",
"default_value": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84", "default_value": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84",
"label": "End GCode",
"type": "str", "type": "str",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
@ -59,8 +59,8 @@
}, },
"material_bed_temp_wait": "material_bed_temp_wait":
{ {
"description": "Whether to insert a command to wait until the bed temperature is reached at the start.",
"label": "Wait for bed heatup", "label": "Wait for bed heatup",
"description": "Whether to insert a command to wait until the bed temperature is reached at the start.",
"default_value": true, "default_value": true,
"type": "bool", "type": "bool",
"settable_per_mesh": false, "settable_per_mesh": false,
@ -69,49 +69,49 @@
}, },
"material_print_temp_prepend": "material_print_temp_prepend":
{ {
"label": "Wait for material heatup",
"description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.", "description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.",
"default_value": true, "default_value": true,
"type": "bool", "type": "bool",
"label": "Wait for material heatup",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_width": "machine_width":
{ {
"label": "Machine width",
"description": "The width (X-direction) of the printable area.", "description": "The width (X-direction) of the printable area.",
"default_value": 100, "default_value": 100,
"type": "float", "type": "float",
"label": "Machine width",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_depth": "machine_depth":
{ {
"label": "Machine depth",
"description": "The depth (Y-direction) of the printable area.", "description": "The depth (Y-direction) of the printable area.",
"default_value": 100, "default_value": 100,
"type": "float", "type": "float",
"label": "Machine depth",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_height": "machine_height":
{ {
"label": "Machine height",
"description": "The height (Z-direction) of the printable area.", "description": "The height (Z-direction) of the printable area.",
"default_value": 100, "default_value": 100,
"type": "float", "type": "float",
"label": "Machine height",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_heated_bed": "machine_heated_bed":
{ {
"label": "Has heated bed",
"description": "Whether the machine has a heated bed present.", "description": "Whether the machine has a heated bed present.",
"default_value": false, "default_value": false,
"label": "Has heated bed",
"type": "bool", "type": "bool",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
@ -119,28 +119,28 @@
}, },
"machine_center_is_zero": "machine_center_is_zero":
{ {
"label": "Is center origin",
"description": "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area.", "description": "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area.",
"default_value": false, "default_value": false,
"type": "bool", "type": "bool",
"label": "Is center origin",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_extruder_count": "machine_extruder_count":
{ {
"label": "Number extruders",
"description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.", "description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.",
"default_value": 1, "default_value": 1,
"type": "int", "type": "int",
"label": "Number extruders",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_nozzle_tip_outer_diameter": "machine_nozzle_tip_outer_diameter":
{ {
"description": "The outer diameter of the tip of the nozzle.",
"label": "Outer nozzle diameter", "label": "Outer nozzle diameter",
"description": "The outer diameter of the tip of the nozzle.",
"default_value": 1, "default_value": 1,
"type": "float", "type": "float",
"settable_per_mesh": false, "settable_per_mesh": false,
@ -150,74 +150,87 @@
}, },
"machine_nozzle_head_distance": "machine_nozzle_head_distance":
{ {
"label": "Nozzle length",
"description": "The height difference between the tip of the nozzle and the lowest part of the print head.", "description": "The height difference between the tip of the nozzle and the lowest part of the print head.",
"default_value": 3, "default_value": 3,
"type": "float", "type": "float",
"label": "Nozzle length",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_nozzle_expansion_angle": "machine_nozzle_expansion_angle":
{ {
"label": "Nozzle angle",
"description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.", "description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.",
"default_value": 45, "default_value": 45,
"type": "int", "type": "int",
"label": "Nozzle angle",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_heat_zone_length": "machine_heat_zone_length":
{ {
"label": "Heat zone length",
"description": "The distance from the tip of the nozzle in which heat from the nozzle is transfered to the filament.", "description": "The distance from the tip of the nozzle in which heat from the nozzle is transfered to the filament.",
"default_value": 16, "default_value": 16,
"type": "float", "type": "float",
"label": "Heat zone length",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true, "settable_per_extruder": true,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_nozzle_heat_up_speed": "machine_nozzle_heat_up_speed":
{ {
"label": "Heat up speed",
"description": "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.", "description": "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.",
"default_value": 2.0, "default_value": 2.0,
"unit": "°C/s",
"type": "float", "type": "float",
"label": "Heat up speed",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
}, },
"machine_nozzle_cool_down_speed": "machine_nozzle_cool_down_speed":
{ {
"label": "Cool down speed",
"description": "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.", "description": "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.",
"default_value": 2.0, "default_value": 2.0,
"unit": "°C/s",
"type": "float",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"machine_min_cool_heat_time_window":
{
"label": "Minimal Time Standby Temperature",
"description": "The minimal time an extruder has to be inactive before the nozzle is cooled. Only when an extruder is not used for longer than this time will it be allowed to cool down to the standby temperature.",
"default_value": 50.0,
"unit": "s",
"type": "float", "type": "float",
"label": "Cool down speed",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
}, },
"machine_gcode_flavor": "machine_gcode_flavor":
{ {
"label": "Gcode flavour",
"description": "The type of gcode to be generated.", "description": "The type of gcode to be generated.",
"default_value": "RepRap", "default_value": "RepRap",
"type": "str", "type": "str",
"label": "Gcode flavour",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_disallowed_areas": "machine_disallowed_areas":
{ {
"label": "Disallowed areas",
"description": "A list of polygons with areas the print head is not allowed to enter.", "description": "A list of polygons with areas the print head is not allowed to enter.",
"type": "polygons", "type": "polygons",
"default_value": [], "default_value": [],
"label": "Disallowed areas",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_head_polygon": "machine_head_polygon":
{ {
"label": "Machine head polygon",
"description": "A 2D silhouette of the print head (fan caps excluded).", "description": "A 2D silhouette of the print head (fan caps excluded).",
"type": "polygon", "type": "polygon",
"default_value": "default_value":
@ -239,13 +252,13 @@
1 1
] ]
], ],
"label": "Machine head polygon",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"machine_head_with_fans_polygon": "machine_head_with_fans_polygon":
{ {
"label": "Machine head & Fan polygon",
"description": "A 2D silhouette of the print head (fan caps included).", "description": "A 2D silhouette of the print head (fan caps included).",
"type": "polygon", "type": "polygon",
"default_value": "default_value":
@ -267,16 +280,15 @@
-10 -10
] ]
], ],
"label": "Machine head & Fan polygon",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"settable_per_meshgroup": false "settable_per_meshgroup": false
}, },
"gantry_height": "gantry_height":
{ {
"label": "Gantry height",
"description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).", "description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).",
"default_value": 99999999999, "default_value": 99999999999,
"label": "Gantry height",
"type": "float", "type": "float",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
@ -1012,16 +1024,34 @@
"enabled": "retraction_enable", "enabled": "retraction_enable",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"retraction_hop": { "retraction_hop_enabled": {
"label": "Z Hop when Retracting", "label": "Z Hop when Retracted",
"description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.", "description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.",
"unit": "mm", "type": "bool",
"type": "float", "default_value": false,
"default_value": 0,
"minimum_value_warning": "-0.0001",
"maximum_value_warning": "10",
"enabled": "retraction_enable", "enabled": "retraction_enable",
"settable_per_mesh": true "settable_per_mesh": true,
"children": {
"retraction_hop_only_when_collides": {
"label": "Z Hop Only Over Printed Parts",
"description": "Only perform a Z Hop when moving over printed parts which cannot be avoided by horizontal motion by Avoid Printed Parts when Traveling.",
"type": "bool",
"default_value": false,
"enabled": "retraction_enable and retraction_hop_enabled and travel_avoid_other_parts",
"settable_per_mesh": true
},
"retraction_hop": {
"label": "Z Hop Height",
"description": "The height difference when performing a Z Hop.",
"unit": "mm",
"type": "float",
"default_value": 1,
"minimum_value_warning": "-0.0001",
"maximum_value_warning": "10",
"enabled": "retraction_enable and retraction_hop_enabled",
"settable_per_mesh": true
}
}
}, },
"material_standby_temperature": "material_standby_temperature":
{ {
@ -1093,16 +1123,12 @@
} }
} }
}, },
"switch_extruder_retraction_hop": "retraction_hop_after_extruder_switch": {
{ "label": "Z Hop After Extruder Switch",
"label": "Nozzle Switch Z Hop", "description": "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print.",
"description": "Whenever the machine switches to another nozzle, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle which has been unused for a while from oozing material on the outside of the print.", "type": "bool",
"type": "float", "default_value": true,
"unit": "mm", "enabled": "retraction_hop_enabled",
"default_value": 1,
"minimum_value_warning": "-0.0001",
"maximum_value_warning": "10",
"enabled": "retraction_enable",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
} }
@ -1503,7 +1529,7 @@
"jerk_enabled": { "jerk_enabled": {
"label": "Enable Jerk Control", "label": "Enable Jerk Control",
"description": "Enables adjusting the jerk of print head when the X or Y axis halts or starts to move. Increasing the jerk can reduce printing time at the cost of print quality.", "description": "Enables adjusting the jerk of print head when the velocity in the X or Y axis changes. Increasing the jerk can reduce printing time at the cost of print quality.",
"type": "bool", "type": "bool",
"default_value": false, "default_value": false,
"settable_per_mesh": false, "settable_per_mesh": false,
@ -1511,7 +1537,7 @@
}, },
"jerk_print": { "jerk_print": {
"label": "Print Jerk", "label": "Print Jerk",
"description": "The maximal allowed jerk of the print head when starting to move or when changing direction.", "description": "The maximum instantaneous velocity change of the print head.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"minimum_value": "0.1", "minimum_value": "0.1",
@ -1523,7 +1549,7 @@
"children": { "children": {
"jerk_infill": { "jerk_infill": {
"label": "Infill Jerk", "label": "Infill Jerk",
"description": "The jerk with which infill is printed.", "description": "The maximum instantaneous velocity change with which infill is printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"minimum_value": "0.1", "minimum_value": "0.1",
@ -1536,7 +1562,7 @@
}, },
"jerk_wall": { "jerk_wall": {
"label": "Wall Jerk", "label": "Wall Jerk",
"description": "The jerk with which the walls are printed.", "description": "The maximum instantaneous velocity change with which the walls are printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"minimum_value": "0.1", "minimum_value": "0.1",
@ -1549,7 +1575,7 @@
"children": { "children": {
"jerk_wall_0": { "jerk_wall_0": {
"label": "Outer Wall Jerk", "label": "Outer Wall Jerk",
"description": "The jerk with which the outermost walls are printed.", "description": "The maximum instantaneous velocity change with which the outermost walls are printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"minimum_value": "0.1", "minimum_value": "0.1",
@ -1562,7 +1588,7 @@
}, },
"jerk_wall_x": { "jerk_wall_x": {
"label": "Inner Wall Jerk", "label": "Inner Wall Jerk",
"description": "The jerk with which all inner walls are printed.", "description": "The maximum instantaneous velocity change with which all inner walls are printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"minimum_value": "0.1", "minimum_value": "0.1",
@ -1577,7 +1603,7 @@
}, },
"jerk_topbottom": { "jerk_topbottom": {
"label": "Top/Bottom Jerk", "label": "Top/Bottom Jerk",
"description": "The jerk with which top/bottom layers are printed.", "description": "The maximum instantaneous velocity change with which top/bottom layers are printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"minimum_value": "0.1", "minimum_value": "0.1",
@ -1590,7 +1616,7 @@
}, },
"jerk_support": { "jerk_support": {
"label": "Support Jerk", "label": "Support Jerk",
"description": "The jerk with which the support structure is printed.", "description": "The maximum instantaneous velocity change with which the support structure is printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"minimum_value": "0.1", "minimum_value": "0.1",
@ -1604,7 +1630,7 @@
"children": { "children": {
"jerk_support_infill": { "jerk_support_infill": {
"label": "Support Infill Jerk", "label": "Support Infill Jerk",
"description": "The jerk with which the infill of support is printed.", "description": "The maximum instantaneous velocity change with which the infill of support is printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"default_value": 20, "default_value": 20,
@ -1618,7 +1644,7 @@
}, },
"jerk_support_roof": { "jerk_support_roof": {
"label": "Support Roof Jerk", "label": "Support Roof Jerk",
"description": "The jerk with which the roofs of support are printed.", "description": "The maximum instantaneous velocity change with which the roofs of support are printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"default_value": 20, "default_value": 20,
@ -1634,7 +1660,7 @@
}, },
"jerk_prime_tower": { "jerk_prime_tower": {
"label": "Prime Tower Jerk", "label": "Prime Tower Jerk",
"description": "The jerk with which the prime tower is printed.", "description": "The maximum instantaneous velocity change with which the prime tower is printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"minimum_value": "0.1", "minimum_value": "0.1",
@ -1649,7 +1675,7 @@
}, },
"jerk_travel": { "jerk_travel": {
"label": "Travel Jerk", "label": "Travel Jerk",
"description": "The jerk with which travel moves are made.", "description": "The maximum instantaneous velocity change with which travel moves are made.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"default_value": 30, "default_value": 30,
@ -1662,7 +1688,7 @@
}, },
"jerk_layer_0": { "jerk_layer_0": {
"label": "Initial Layer Jerk", "label": "Initial Layer Jerk",
"description": "The print jerk for the initial layer.", "description": "The print maximum instantaneous velocity change for the initial layer.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"default_value": 20, "default_value": 20,
@ -1675,7 +1701,7 @@
}, },
"jerk_skirt": { "jerk_skirt": {
"label": "Skirt Jerk", "label": "Skirt Jerk",
"description": "The jerk with which the skirt and brim are printed.", "description": "The maximum instantaneous velocity change with which the skirt and brim are printed.",
"unit": "mm/s³", "unit": "mm/s³",
"type": "float", "type": "float",
"default_value": 20, "default_value": 20,
@ -2987,7 +3013,7 @@
{ {
"label": "Experimental Modes", "label": "Experimental Modes",
"type": "category", "type": "category",
"icon": "category_blackmagic", "icon": "category_experimental",
"description": "experimental!", "description": "experimental!",
"children": "children":
{ {

View file

@ -50,10 +50,10 @@
"default_value": "RepRap (Marlin/Sprinter)" "default_value": "RepRap (Marlin/Sprinter)"
}, },
"machine_start_gcode": { "machine_start_gcode": {
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG91 ;relative positioning\nG1 Y-10.0000 F9000 ;compensate firmware head move 1cm right after endstop\nG92 Y0 ;zero Y\nG90 ;absolute positioning\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."
}, },
"machine_end_gcode": { "machine_end_gcode": {
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
} }
} }
} }

View file

@ -0,0 +1,66 @@
{
"id": "mankati_fullscale_xt_plus",
"version": 2,
"name": "Mankati Fullscale XT Plus",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "RBC",
"manufacturer": "Mankati",
"category": "Other",
"file_formats": "text/x-gcode",
"platform": "mankati_fullscale_xt_plus_platform.stl"
},
"overrides": {
"machine_width": { "default_value": 260 },
"machine_depth": { "default_value": 260 },
"machine_height": { "default_value": 300 },
"machine_heated_bed": { "default_value": true },
"machine_nozzle_size": { "default_value": 0.4 },
"machine_nozzle_heat_up_speed": { "default_value": 2 },
"machine_nozzle_cool_down_speed": { "default_value": 2 },
"machine_head_with_fans_polygon": {
"default_value": [
[ -3, 3 ],
[ -3, -3 ],
[ 3, -3 ],
[ 3, 3 ]
]
},
"gantry_height": { "default_value": 0 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "M117 Initializing...\nG28 ; home all axes\nG90 ; use absolute coordinates\nG1 F12000 X0 Y0 Z30 ; lift nozzle 30 mm\nT0 ; select extruder 1\nG92 E0 ; reset extruder length\nG1 F100 Z30 E7 ; extrude 7mm while going up\nG92 E0 ; zero the extruder length\nM117 Printing...\n"
},
"machine_end_gcode": {
"default_value": "M104 T0 S0 ; turn off extruder 1 heating\nM140 S0 ; turn off bed heating\nG91 ; relative positioning\nG1 F12000 E-0.5 ; retract 0.5 mm\nG1 F12000 Z30 ; move Z-axes 30 mm down\nG28 X0 Y0 ; home X axis and Y axes\nM84 ; disable motors\nM117 Ready!\n"
},
"layer_height": { "default_value": 0.2 },
"wall_thickness": { "default_value": 0.8 },
"top_bottom_thickness": { "default_value": 0.3 },
"material_print_temperature": { "default_value": 195 },
"material_bed_temperature": { "default_value": 60 },
"material_diameter": { "default_value": 1.75 },
"retraction_enable": { "default_value": true },
"retraction_speed": { "default_value": 50 },
"retraction_amount": { "default_value": 0.8 },
"retraction_hop": { "default_value": 0.075 },
"speed_print": { "default_value": 60 },
"speed_infill": { "default_value": 100 },
"speed_topbottom": { "default_value": 15 },
"speed_travel": { "default_value": 150 },
"speed_layer_0": {
"minimum_value": "0.1",
"default": 15.0
},
"infill_overlap": { "default": 10 },
"cool_fan_enabled": { "default": false },
"cool_fan_speed": { "default": 0 },
"skirt_line_count": { "default": 3 },
"skirt_gap": { "default": 4 },
"skirt_minimal_length": { "default": 200 }
}
}

View file

@ -14,7 +14,7 @@
"has_materials": true, "has_materials": true,
"preferred_material": "*pla*", "preferred_material": "*pla*",
"preferred_quality": "*normal*", "preferred_quality": "*normal*",
"supported_actions":["UMOCheckup", "UpgradeFirmware", "BedLevel"] "supported_actions":["UMOCheckup", "UpgradeFirmware", "BedLevel", "UMOUpgradeSelection"]
}, },
"overrides": { "overrides": {

View file

@ -18,6 +18,11 @@ UM.MainWindow
//: Cura application window title //: Cura application window title
title: catalog.i18nc("@title:window","Cura"); title: catalog.i18nc("@title:window","Cura");
viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0)
property bool monitoringPrint: false
Component.onCompleted:
{
Printer.setMinimumWindowSize(UM.Theme.getSize("window_minimum_size"))
}
Item Item
{ {
@ -256,17 +261,6 @@ UM.MainWindow
} }
} }
UM.MessageStack
{
anchors
{
horizontalCenter: parent.horizontalCenter
horizontalCenterOffset: -(UM.Theme.getSize("sidebar").width/ 2)
top: parent.verticalCenter;
bottom: parent.bottom;
}
}
Loader Loader
{ {
id: view_panel id: view_panel
@ -357,9 +351,57 @@ UM.MainWindow
bottom: parent.bottom; bottom: parent.bottom;
right: parent.right; right: parent.right;
} }
onMonitoringPrintChanged: base.monitoringPrint = monitoringPrint
width: UM.Theme.getSize("sidebar").width; width: UM.Theme.getSize("sidebar").width;
} }
Rectangle
{
id: viewportOverlay
color: UM.Theme.getColor("viewport_overlay")
anchors
{
top: parent.top
bottom: parent.bottom
left:parent.left
right: sidebar.left
}
visible: opacity > 0
opacity: base.monitoringPrint ? 0.75 : 0
Behavior on opacity { NumberAnimation { duration: 100; } }
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.AllButtons
onWheel: wheel.accepted = true
}
}
Image
{
id: cameraImage
width: Math.min(viewportOverlay.width, sourceSize.width)
height: sourceSize.height * width / sourceSize.width
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenterOffset: - UM.Theme.getSize("sidebar").width / 2
visible: base.monitoringPrint
source: Cura.MachineManager.printerOutputDevices.length > 0 ? Cura.MachineManager.printerOutputDevices[0].cameraImage : ""
}
UM.MessageStack
{
anchors
{
horizontalCenter: parent.horizontalCenter
horizontalCenterOffset: -(UM.Theme.getSize("sidebar").width/ 2)
top: parent.verticalCenter;
bottom: parent.bottom;
}
}
} }
} }

View file

@ -0,0 +1,201 @@
// Copyright (c) 2016 Ultimaker B.V.
// Cura is released under the terms of the AGPLv3 or higher.
import QtQuick 2.2
import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.1
import QtQuick.Layouts 1.1
import UM 1.1 as UM
import Cura 1.0 as Cura
Rectangle
{
id: base;
UM.I18nCatalog { id: catalog; name:"cura"}
property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0
property real progress: printerConnected ? Cura.MachineManager.printerOutputDevices[0].progress : 0;
property int backendState: UM.Backend.state;
property variant statusColor:
{
if(!printerConnected)
return UM.Theme.getColor("status_offline")
else if(Cura.MachineManager.printerOutputDevices[0].jobState == "printing")
return UM.Theme.getColor("status_busy")
else if(Cura.MachineManager.printerOutputDevices[0].jobState == "ready")
return UM.Theme.getColor("status_ready")
else if(Cura.MachineManager.printerOutputDevices[0].jobState == "paused")
return UM.Theme.getColor("status_paused")
else if (Cura.MachineManager.printerOutputDevices[0].jobState == "error")
return UM.Theme.getColor("status_stopped")
else
return UM.Theme.getColor("text")
}
property bool activity: Printer.getPlatformActivity;
property int totalHeight: childrenRect.height + UM.Theme.getSize("default_margin").height
property string fileBaseName
property string statusText:
{
if(!printerConnected)
{
return catalog.i18nc("@label:", "Please check your printer connections")
} else if(Cura.MachineManager.printerOutputDevices[0].jobState == "printing")
{
return catalog.i18nc("@label:", "Printing...")
} else if(Cura.MachineManager.printerOutputDevices[0].jobState == "paused")
{
return catalog.i18nc("@label:", "Paused")
}
else if(Cura.MachineManager.printerOutputDevices[0].jobState == "pre_print")
{
return catalog.i18nc("@label:", "Preparing...")
}
else
{
return " "
}
}
Label
{
id: statusLabel
width: parent.width - 2 * UM.Theme.getSize("default_margin").width
anchors.top: parent.top
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
color: base.statusColor
font: UM.Theme.getFont("large")
text: statusText;
}
Label
{
id: percentageLabel
anchors.top: parent.top
anchors.right: progressBar.right
color: base.statusColor
font: UM.Theme.getFont("large")
text: Math.round(progress) + "%";
visible: printerConnected
}
Rectangle
{
id: progressBar
width: parent.width - 2 * UM.Theme.getSize("default_margin").width
height: UM.Theme.getSize("progressbar").height
anchors.top: statusLabel.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height / 4
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
radius: UM.Theme.getSize("progressbar_radius").width
color: UM.Theme.getColor("progressbar_background")
Rectangle
{
width: Math.max(parent.width * base.progress / 100)
height: parent.height
color: base.statusColor
radius: UM.Theme.getSize("progressbar_radius").width
}
}
Button
{
id: abortButton
visible: printerConnected
enabled: printerConnected && (Cura.MachineManager.printerOutputDevices[0].jobState == "paused" || Cura.MachineManager.printerOutputDevices[0].jobState == "printing")
height: UM.Theme.getSize("save_button_save_to_button").height
anchors.top: progressBar.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.right: parent.right
anchors.rightMargin: UM.Theme.getSize("default_margin").width
text: catalog.i18nc("@label:", "Abort Print")
onClicked: { Cura.MachineManager.printerOutputDevices[0].setJobState("abort") }
style: ButtonStyle
{
background: Rectangle
{
border.width: UM.Theme.getSize("default_lining").width
border.color: !control.enabled ? UM.Theme.getColor("action_button_disabled_border") :
control.pressed ? UM.Theme.getColor("action_button_active_border") :
control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
color: !control.enabled ? UM.Theme.getColor("action_button_disabled") :
control.pressed ? UM.Theme.getColor("action_button_active") :
control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
Behavior on color { ColorAnimation { duration: 50; } }
implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2)
Label
{
id: actualLabel
anchors.centerIn: parent
color: !control.enabled ? UM.Theme.getColor("action_button_disabled_text") :
control.pressed ? UM.Theme.getColor("action_button_active_text") :
control.hovered ? UM.Theme.getColor("action_button_hovered_text") : UM.Theme.getColor("action_button_text")
font: UM.Theme.getFont("action_button")
text: control.text;
}
}
label: Item { }
}
}
Button
{
id: pauseButton
visible: printerConnected
enabled: printerConnected && (Cura.MachineManager.printerOutputDevices[0].jobState == "paused" || Cura.MachineManager.printerOutputDevices[0].jobState == "printing")
height: UM.Theme.getSize("save_button_save_to_button").height
anchors.top: progressBar.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.right: abortButton.left
anchors.rightMargin: UM.Theme.getSize("default_margin").width
text: printerConnected ? Cura.MachineManager.printerOutputDevices[0].jobState == "paused" ? catalog.i18nc("@label:", "Resume") : catalog.i18nc("@label:", "Pause") : ""
onClicked: { Cura.MachineManager.printerOutputDevices[0].jobState == "paused" ? Cura.MachineManager.printerOutputDevices[0].setJobState("print") : Cura.MachineManager.printerOutputDevices[0].setJobState("pause") }
style: ButtonStyle
{
background: Rectangle
{
border.width: UM.Theme.getSize("default_lining").width
border.color: !control.enabled ? UM.Theme.getColor("action_button_disabled_border") :
control.pressed ? UM.Theme.getColor("action_button_active_border") :
control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
color: !control.enabled ? UM.Theme.getColor("action_button_disabled") :
control.pressed ? UM.Theme.getColor("action_button_active") :
control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
Behavior on color { ColorAnimation { duration: 50; } }
implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2)
Label
{
id: actualLabel
anchors.centerIn: parent
color: !control.enabled ? UM.Theme.getColor("action_button_disabled_text") :
control.pressed ? UM.Theme.getColor("action_button_active_text") :
control.hovered ? UM.Theme.getColor("action_button_hovered_text") : UM.Theme.getColor("action_button_text")
font: UM.Theme.getFont("action_button")
text: control.text;
}
}
label: Item { }
}
}
}

View file

@ -81,7 +81,7 @@ UM.ManagementPage
Repeater Repeater
{ {
id: machineActionRepeater id: machineActionRepeater
model: Cura.MachineActionManager.getSupportedActions(Cura.MachineManager.activeDefinitionId) model: Cura.MachineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id))
Button Button
{ {

View file

@ -6,7 +6,7 @@ import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.1 import QtQuick.Controls.Styles 1.1
import QtQuick.Layouts 1.1 import QtQuick.Layouts 1.1
import UM 1.1 as UM import UM 1.2 as UM
import Cura 1.0 as Cura import Cura 1.0 as Cura
Rectangle Rectangle
@ -14,6 +14,12 @@ Rectangle
id: base; id: base;
property int currentModeIndex; property int currentModeIndex;
property bool monitoringPrint: false
Connections
{
target: Printer
onShowPrintMonitor: base.monitoringPrint = show
}
// Is there an output device for this printer? // Is there an output device for this printer?
property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0
@ -21,6 +27,7 @@ Rectangle
color: UM.Theme.getColor("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)
{ {
tooltip.text = text; tooltip.text = text;
@ -33,6 +40,22 @@ Rectangle
tooltip.hide(); tooltip.hide();
} }
function strPadLeft(string, pad, length) {
return (new Array(length + 1).join(pad) + string).slice(-length);
}
function getPrettyTime(time)
{
var hours = Math.floor(time / 3600)
time -= hours * 3600
var minutes = Math.floor(time / 60);
time -= minutes * 60
var seconds = Math.floor(time);
var finalTime = strPadLeft(hours, "0", 2) + ':' + strPadLeft(minutes,'0',2)+ ':' + strPadLeft(seconds,'0',2);
return finalTime;
}
MouseArea MouseArea
{ {
anchors.fill: parent anchors.fill: parent
@ -44,12 +67,63 @@ Rectangle
} }
} }
// Mode selection buttons for changing between Setting & Monitor print mode
Rectangle
{
id: sidebarHeaderBar
anchors.left: parent.left
anchors.right: parent.right
height: childrenRect.height
color: UM.Theme.getColor("sidebar_header_bar")
Row
{
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width;
anchors.right: parent.right
Button
{
width: (parent.width - UM.Theme.getSize("default_margin").width) / 2
height: UM.Theme.getSize("sidebar_header").height
onClicked: monitoringPrint = false
iconSource: UM.Theme.getIcon("tab_settings");
checkable: true
checked: !monitoringPrint
exclusiveGroup: sidebarHeaderBarGroup
style: UM.Theme.styles.sidebar_header_tab
}
Button
{
width: (parent.width - UM.Theme.getSize("default_margin").width) / 2
height: UM.Theme.getSize("sidebar_header").height
onClicked: monitoringPrint = true
iconSource: {
if(!printerConnected)
return UM.Theme.getIcon("tab_monitor")
else if(Cura.MachineManager.printerOutputDevices[0].jobState == "printing")
return UM.Theme.getIcon("tab_monitor_busy")
else if(Cura.MachineManager.printerOutputDevices[0].jobState == "paused")
return UM.Theme.getIcon("tab_monitor_paused")
else if (Cura.MachineManager.printerOutputDevices[0].jobState != "error")
return UM.Theme.getIcon("tab_monitor_connected")
}
checkable: true
checked: monitoringPrint
exclusiveGroup: sidebarHeaderBarGroup
style: UM.Theme.styles.sidebar_header_tab
}
ExclusiveGroup { id: sidebarHeaderBarGroup }
}
}
SidebarHeader { SidebarHeader {
id: header id: header
width: parent.width width: parent.width
height: totalHeightHeader height: totalHeightHeader
anchors.top: parent.top anchors.top: sidebarHeaderBar.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.topMargin: UM.Theme.getSize("default_margin").height
onShowTooltip: base.showTooltip(item, location, text) onShowTooltip: base.showTooltip(item, location, text)
@ -85,14 +159,15 @@ Rectangle
Label { Label {
id: settingsModeLabel id: settingsModeLabel
text: catalog.i18nc("@label:listbox","Setup"); text: catalog.i18nc("@label:listbox","Print Setup");
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width; anchors.leftMargin: UM.Theme.getSize("default_margin").width;
anchors.top: headerSeparator.bottom anchors.top: headerSeparator.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width/100*45 width: parent.width/100*45
font: UM.Theme.getFont("large"); font: UM.Theme.getFont("large")
color: UM.Theme.getColor("text") color: UM.Theme.getColor("text")
visible: !monitoringPrint
} }
Rectangle { Rectangle {
@ -103,6 +178,7 @@ Rectangle
anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.top: headerSeparator.bottom anchors.top: headerSeparator.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.topMargin: UM.Theme.getSize("default_margin").height
visible: !monitoringPrint
Component{ Component{
id: wizardDelegate id: wizardDelegate
Button { Button {
@ -152,6 +228,19 @@ Rectangle
} }
} }
Label {
id: monitorLabel
text: catalog.i18nc("@label","Printer Monitor");
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width;
anchors.top: headerSeparator.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width/100*45
font: UM.Theme.getFont("large")
color: UM.Theme.getColor("text")
visible: monitoringPrint
}
StackView StackView
{ {
id: sidebarContents id: sidebarContents
@ -161,6 +250,7 @@ Rectangle
anchors.topMargin: UM.Theme.getSize("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
visible: !monitoringPrint
delegate: StackViewDelegate delegate: StackViewDelegate
{ {
@ -191,23 +281,152 @@ Rectangle
} }
} }
Rectangle { // Item that shows the print monitor properties
Column
{
id: printMonitor
anchors.bottom: footerSeparator.top
anchors.top: monitorLabel.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.left: base.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.right: base.right
visible: monitoringPrint
Loader
{
sourceComponent: monitorSection
property string label: catalog.i18nc("@label", "Temperatures")
}
Repeater
{
model: machineExtruderCount.properties.value
delegate: Loader
{
sourceComponent: monitorItem
property string label: machineExtruderCount.properties.value > 1 ? catalog.i18nc("@label", "Hotend Temperature %1").arg(index + 1) : catalog.i18nc("@label", "Hotend Temperature")
property string value: printerConnected ? Math.round(Cura.MachineManager.printerOutputDevices[0].hotendTemperatures[index]) + "°C" : ""
}
}
Repeater
{
model: machineHeatedBed.properties.value == "True" ? 1 : 0
delegate: Loader
{
sourceComponent: monitorItem
property string label: catalog.i18nc("@label", "Bed Temperature")
property string value: printerConnected ? Math.round(Cura.MachineManager.printerOutputDevices[0].bedTemperature) + "°C" : ""
}
}
Loader
{
sourceComponent: monitorSection
property string label: catalog.i18nc("@label", "Active print")
}
Loader
{
sourceComponent: monitorItem
property string label: catalog.i18nc("@label", "Job Name")
property string value: printerConnected ? Cura.MachineManager.printerOutputDevices[0].jobName : ""
}
Loader
{
sourceComponent: monitorItem
property string label: catalog.i18nc("@label", "Printing Time")
property string value: printerConnected ? getPrettyTime(Cura.MachineManager.printerOutputDevices[0].timeTotal) : ""
}
Loader
{
sourceComponent: monitorItem
property string label: catalog.i18nc("@label", "Estimated time left")
property string value: printerConnected ? getPrettyTime(Cura.MachineManager.printerOutputDevices[0].timeTotal - Cura.MachineManager.printerOutputDevices[0].timeElapsed) : ""
}
Loader
{
sourceComponent: monitorItem
property string label: catalog.i18nc("@label", "Current Layer")
property string value: printerConnected ? "0" : ""
}
Component
{
id: monitorItem
Row
{
height: UM.Theme.getSize("setting_control").height
Label
{
text: label
color: printerConnected ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text")
font: UM.Theme.getFont("default")
width: base.width * 0.4
elide: Text.ElideRight
anchors.verticalCenter: parent.verticalCenter
}
Label
{
text: value
color: printerConnected ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text")
font: UM.Theme.getFont("default")
anchors.verticalCenter: parent.verticalCenter
}
}
}
Component
{
id: monitorSection
Rectangle
{
color: UM.Theme.getColor("setting_category")
width: base.width - 2 * UM.Theme.getSize("default_margin").width
height: UM.Theme.getSize("section").height
Label
{
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
text: label
font: UM.Theme.getFont("setting_category")
color: UM.Theme.getColor("setting_category_text")
}
}
}
}
Rectangle
{
id: footerSeparator id: footerSeparator
width: parent.width width: parent.width
height: UM.Theme.getSize("sidebar_lining").height height: UM.Theme.getSize("sidebar_lining").height
color: UM.Theme.getColor("sidebar_lining") color: UM.Theme.getColor("sidebar_lining")
anchors.bottom: saveButton.top anchors.bottom: saveButton.top
anchors.bottomMargin: UM.Theme.getSize("default_margin").height anchors.bottomMargin: UM.Theme.getSize("default_margin").height
} }
SaveButton SaveButton
{ {
id: saveButton; id: saveButton
implicitWidth: base.width implicitWidth: base.width
implicitHeight: totalHeight implicitHeight: totalHeight
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
visible: !monitoringPrint
} }
MonitorButton
{
id: monitorButton
implicitWidth: base.width
implicitHeight: totalHeight
anchors.bottom: parent.bottom
visible: monitoringPrint
}
SidebarTooltip SidebarTooltip
{ {
id: tooltip; id: tooltip;
@ -242,4 +461,24 @@ Rectangle
modesListModel.append({ text: catalog.i18nc("@title:tab", "Advanced"), item: sidebarAdvanced }) modesListModel.append({ text: catalog.i18nc("@title:tab", "Advanced"), item: sidebarAdvanced })
sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "immediate": true }); sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "immediate": true });
} }
}
UM.SettingPropertyProvider
{
id: machineExtruderCount
containerStackId: Cura.MachineManager.activeMachineId
key: "machine_extruder_count"
watchedProperties: [ "value" ]
storeIndex: 0
}
UM.SettingPropertyProvider
{
id: machineHeatedBed
containerStackId: Cura.MachineManager.activeMachineId
key: "machine_heated_bed"
watchedProperties: [ "value" ]
storeIndex: 0
}
}

View file

@ -92,7 +92,8 @@ Column
onGlobalContainerChanged: onGlobalContainerChanged:
{ {
base.currentExtruderIndex = -1; base.currentExtruderIndex = -1;
ExtruderManager.setActiveExtruderIndex(index); forceActiveFocus()
ExtruderManager.setActiveExtruderIndex(0);
} }
} }
@ -109,7 +110,7 @@ Column
onClicked: onClicked:
{ {
focus = true; //Changing focus applies the currently-being-typed values so it can change the displayed setting values. forceActiveFocus() //Changing focus applies the currently-being-typed values so it can change the displayed setting values.
base.currentExtruderIndex = index; base.currentExtruderIndex = index;
ExtruderManager.setActiveExtruderIndex(index); ExtruderManager.setActiveExtruderIndex(index);
} }

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:i="&amp;#38;#38;#38;#38;ns_ai;"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
width="30px"
height="30px"
viewBox="0 0 30 30"
enable-background="new 0 0 30 30"
xml:space="preserve"
id="svg3445"
inkscape:version="0.91 r13725"
sodipodi:docname="category_experimental.svg"><metadata
id="metadata3464"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs3462" /><sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="748"
id="namedview3460"
showgrid="false"
inkscape:zoom="16.233993"
inkscape:cx="15"
inkscape:cy="15"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g3449" /><switch
id="switch3447"
style="fill:#000000"><foreignObject
requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/"
x="0"
y="0"
width="1"
height="1"><i:pgfRef
xlink:href="#adobe_illustrator_pgf" /></foreignObject><g
i:extraneous="self"
id="g3449"
style="fill:#000000"><g
id="frame_30x30"
display="none"
style="fill:#000000"><rect
display="inline"
width="30"
height="30"
id="rect3452"
style="fill:#000000" /></g><g
id="frame_24x24"
display="none"
style="fill:#000000"><rect
x="3"
y="3"
display="inline"
fill="#C6C7C8"
width="24"
height="24"
id="rect3455"
style="fill:#000000" /></g><path
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 9 3 L 10 11 L 3 27 L 27 27 L 20 11 L 21 3 L 9 3 z M 10.443359 4 L 19.556641 4 L 19.0625 10.648438 L 18.931641 11 L 19.064453 11.351562 L 20.236328 14.478516 L 9.765625 14.478516 L 10.9375 11.351562 L 11.068359 11 L 10.9375 10.648438 L 10.443359 4 z M 13.855469 8.8613281 A 1.5913661 1.5692637 0 0 0 12.263672 10.429688 A 1.5913661 1.5692637 0 0 0 13.855469 12 A 1.5913661 1.5692637 0 0 0 15.447266 10.429688 A 1.5913661 1.5692637 0 0 0 13.855469 8.8613281 z M 13.658203 16.289062 C 14.870119 16.28903 15.852364 17.227542 15.851562 18.384766 C 15.851234 19.541227 14.869319 20.478548 13.658203 20.478516 C 12.44785 20.477519 11.467125 19.540499 11.466797 18.384766 C 11.465996 17.22827 12.44705 16.29006 13.658203 16.289062 z M 9.7949219 21.191406 A 1.6015776 1.6015776 0 0 1 11.396484 22.792969 A 1.6015776 1.6015776 0 0 1 9.7949219 24.394531 A 1.6015776 1.6015776 0 0 1 8.1933594 22.792969 A 1.6015776 1.6015776 0 0 1 9.7949219 21.191406 z "
id="path3458" /></g></switch><i:pgf
id="adobe_illustrator_pgf" /></svg>

After

Width:  |  Height:  |  Size: 4 KiB

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 391 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before After
Before After

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30"
height="30"
viewBox="0 0 30 30"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="tab_monitor.svg">
<metadata
id="metadata15">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Fill 1 Copy 3</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="769"
inkscape:window-height="716"
id="namedview13"
showgrid="false"
showborder="true"
inkscape:zoom="12.421053"
inkscape:cx="19.963695"
inkscape:cy="9.5"
inkscape:window-x="549"
inkscape:window-y="180"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
<title
id="title4">Fill 1 Copy 3</title>
<desc
id="desc6">Created with Sketch.</desc>
<defs
id="defs8" />
<g
id="Page-1"
sketch:type="MSPage"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="matrix(1.3157895,0,0,1.3157895,2.5,2.4999995)">
<g
id="HIG"
sketch:type="MSArtboardGroup"
transform="translate(-718,-2432)"
style="fill:#ffffff">
<path
d="m 718,2432 19,0 0,0.9048 -19,0 0,-0.9048 0,0 z m 0,18.0952 1.73776,0 1.7267,-0.9047 12.13477,0 1.69775,0.9047 1.70302,0 0,0.9048 -1.70166,0 -1.69911,-0.9048 -12.13593,0 -1.72554,0.8949 L 718,2451 l 0,-0.9048 0,0 z m 18.13636,-17.1904 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m -18.13636,0 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m 2.59091,1.8095 13.81818,0 0,12.6667 -13.81818,0 0,-12.6667 0,0 z m 0.86364,0.9047 12.0909,0 0,10.8572 -12.0909,0 0,-10.8572 0,0 z m 4.31818,0 3.45454,0 0,2.7143 -3.45454,0 0,-2.7143 0,0 z m -2.59091,9.9524 8.63636,0 0,0.9048 -8.63636,0 0,-0.9048 0,0 z m 3.45454,-7.2381 1.72728,0 0,0.9048 -1.72728,0 0,-0.9048 0,0 z"
id="Fill-1-Copy-3"
sketch:type="MSShapeGroup"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -0,0 +1,107 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30"
height="30"
viewBox="0 0 30 30"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="tab_monitor_busy.svg">
<metadata
id="metadata15">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Fill 1 Copy 3</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="748"
id="namedview13"
showgrid="false"
showborder="true"
inkscape:zoom="18.366667"
inkscape:cx="15.462795"
inkscape:cy="15.381125"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-global="true"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-intersection-paths="false"
inkscape:snap-bbox="true"
inkscape:snap-others="false"
inkscape:snap-nodes="false" />
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
<title
id="title4">Fill 1 Copy 3</title>
<desc
id="desc6">Created with Sketch.</desc>
<defs
id="defs8" />
<g
id="Page-1"
sketch:type="MSPage"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="matrix(1.3157895,0,0,1.3157895,2.5,2.4999995)">
<g
id="HIG"
sketch:type="MSArtboardGroup"
transform="translate(-718,-2432)"
style="fill:#ffffff">
<path
d="m 718,2432 19,0 0,0.9048 -19,0 0,-0.9048 0,0 z m 0,18.0952 1.73776,0 1.7267,-0.9047 12.13477,0 1.69775,0.9047 1.70302,0 0,0.9048 -1.70166,0 -1.69911,-0.9048 -12.13593,0 -1.72554,0.8949 L 718,2451 l 0,-0.9048 0,0 z m 18.13636,-17.1904 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m -18.13636,0 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m 2.59091,1.8095 13.81818,0 0,12.6667 -13.81818,0 0,-12.6667 0,0 z m 0.86364,0.9047 12.0909,0 0,10.8572 -12.0909,0 0,-10.8572 0,0 z m 4.31818,0 3.45454,0 0,2.7143 -3.45454,0 0,-2.7143 0,0 z m -2.59091,9.9524 8.63636,0 0,0.9048 -8.63636,0 0,-0.9048 0,0 z m 3.45454,-7.2381 1.72728,0 0,0.9048 -1.72728,0 0,-0.9048 0,0 z"
id="Fill-1-Copy-3"
sketch:type="MSShapeGroup"
inkscape:connector-curvature="0" />
</g>
</g>
<circle
style="fill:#0ca9e3;fill-opacity:1"
id="path3337"
cx="22.5"
cy="7.5"
r="7.5" />
<circle
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
id="path4759"
cx="22.5"
cy="7.5"
r="1.5" />
<circle
r="1.5"
cy="7.5"
cx="18.5"
id="circle4761"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" />
<circle
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
id="circle4763"
cx="26.5"
cy="7.5"
r="1.5" />
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30"
height="30"
viewBox="0 0 30 30"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="tab_monitor_connected.svg">
<metadata
id="metadata15">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Fill 1 Copy 3</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="748"
id="namedview13"
showgrid="false"
showborder="true"
inkscape:zoom="18.366667"
inkscape:cx="15"
inkscape:cy="15"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-global="true"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-intersection-paths="false"
inkscape:snap-bbox="true"
inkscape:snap-others="false"
inkscape:snap-nodes="false" />
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
<title
id="title4">Fill 1 Copy 3</title>
<desc
id="desc6">Created with Sketch.</desc>
<defs
id="defs8" />
<g
id="Page-1"
sketch:type="MSPage"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="matrix(1.3157895,0,0,1.3157895,2.5,2.4999995)">
<g
id="HIG"
sketch:type="MSArtboardGroup"
transform="translate(-718,-2432)"
style="fill:#ffffff">
<path
d="m 718,2432 19,0 0,0.9048 -19,0 0,-0.9048 0,0 z m 0,18.0952 1.73776,0 1.7267,-0.9047 12.13477,0 1.69775,0.9047 1.70302,0 0,0.9048 -1.70166,0 -1.69911,-0.9048 -12.13593,0 -1.72554,0.8949 L 718,2451 l 0,-0.9048 0,0 z m 18.13636,-17.1904 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m -18.13636,0 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m 2.59091,1.8095 13.81818,0 0,12.6667 -13.81818,0 0,-12.6667 0,0 z m 0.86364,0.9047 12.0909,0 0,10.8572 -12.0909,0 0,-10.8572 0,0 z m 4.31818,0 3.45454,0 0,2.7143 -3.45454,0 0,-2.7143 0,0 z m -2.59091,9.9524 8.63636,0 0,0.9048 -8.63636,0 0,-0.9048 0,0 z m 3.45454,-7.2381 1.72728,0 0,0.9048 -1.72728,0 0,-0.9048 0,0 z"
id="Fill-1-Copy-3"
sketch:type="MSShapeGroup"
inkscape:connector-curvature="0" />
</g>
</g>
<circle
style="fill:#00cd00;fill-opacity:1"
id="path3337"
cx="22.5"
cy="7.5"
r="7.5" />
<path
style="fill:#ffffff;fill-opacity:1"
d="M 25.546876,4.3017582 21.994141,7.9208992 19.859375,5.8408211 18.5,7.2177742 22.072266,10.698242 C 23.732574,9.0171252 25.519159,7.1853281 26.97461,5.7021492 Z"
id="rect4171"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccc" />
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View file

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30"
height="30"
viewBox="0 0 30 30"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="tab_monitor_offline.svg">
<metadata
id="metadata15">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Fill 1 Copy 3</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="748"
id="namedview13"
showgrid="false"
showborder="true"
inkscape:zoom="18.366667"
inkscape:cx="15.462795"
inkscape:cy="15.381125"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-global="true"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-intersection-paths="false"
inkscape:snap-bbox="true"
inkscape:snap-others="false"
inkscape:snap-nodes="false" />
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
<title
id="title4">Fill 1 Copy 3</title>
<desc
id="desc6">Created with Sketch.</desc>
<defs
id="defs8" />
<g
id="Page-1"
sketch:type="MSPage"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="matrix(1.3157895,0,0,1.3157895,2.5,2.4999995)">
<g
id="HIG"
sketch:type="MSArtboardGroup"
transform="translate(-718,-2432)"
style="fill:#ffffff">
<path
d="m 718,2432 19,0 0,0.9048 -19,0 0,-0.9048 0,0 z m 0,18.0952 1.73776,0 1.7267,-0.9047 12.13477,0 1.69775,0.9047 1.70302,0 0,0.9048 -1.70166,0 -1.69911,-0.9048 -12.13593,0 -1.72554,0.8949 L 718,2451 l 0,-0.9048 0,0 z m 18.13636,-17.1904 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m -18.13636,0 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m 2.59091,1.8095 13.81818,0 0,12.6667 -13.81818,0 0,-12.6667 0,0 z m 0.86364,0.9047 12.0909,0 0,10.8572 -12.0909,0 0,-10.8572 0,0 z m 4.31818,0 3.45454,0 0,2.7143 -3.45454,0 0,-2.7143 0,0 z m -2.59091,9.9524 8.63636,0 0,0.9048 -8.63636,0 0,-0.9048 0,0 z m 3.45454,-7.2381 1.72728,0 0,0.9048 -1.72728,0 0,-0.9048 0,0 z"
id="Fill-1-Copy-3"
sketch:type="MSShapeGroup"
inkscape:connector-curvature="0" />
</g>
</g>
<circle
style="fill:#000000;fill-opacity:1"
id="path3337"
cx="22.5"
cy="7.5"
r="7.5" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="M 20.02539,3.6113281 18.611328,5.0253907 21.085937,7.5 18.611328,9.9746094 20.02539,11.388672 22.5,8.9140625 24.974609,11.388672 26.388672,9.9746094 23.914062,7.5 26.388672,5.0253907 24.974609,3.6113281 22.5,6.0859375 20.02539,3.6113281 Z"
id="rect4713-3"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View file

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30"
height="30"
viewBox="0 0 30 30"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="tab_monitor_paused.svg">
<metadata
id="metadata15">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Fill 1 Copy 3</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="748"
id="namedview13"
showgrid="false"
showborder="true"
inkscape:zoom="18.366667"
inkscape:cx="15.462795"
inkscape:cy="15.381125"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-global="true"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-intersection-paths="false"
inkscape:snap-bbox="true"
inkscape:snap-others="false"
inkscape:snap-nodes="false" />
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
<title
id="title4">Fill 1 Copy 3</title>
<desc
id="desc6">Created with Sketch.</desc>
<defs
id="defs8" />
<g
id="Page-1"
sketch:type="MSPage"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="matrix(1.3157895,0,0,1.3157895,2.5,2.4999995)">
<g
id="HIG"
sketch:type="MSArtboardGroup"
transform="translate(-718,-2432)"
style="fill:#ffffff">
<path
d="m 718,2432 19,0 0,0.9048 -19,0 0,-0.9048 0,0 z m 0,18.0952 1.73776,0 1.7267,-0.9047 12.13477,0 1.69775,0.9047 1.70302,0 0,0.9048 -1.70166,0 -1.69911,-0.9048 -12.13593,0 -1.72554,0.8949 L 718,2451 l 0,-0.9048 0,0 z m 18.13636,-17.1904 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m -18.13636,0 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m 2.59091,1.8095 13.81818,0 0,12.6667 -13.81818,0 0,-12.6667 0,0 z m 0.86364,0.9047 12.0909,0 0,10.8572 -12.0909,0 0,-10.8572 0,0 z m 4.31818,0 3.45454,0 0,2.7143 -3.45454,0 0,-2.7143 0,0 z m -2.59091,9.9524 8.63636,0 0,0.9048 -8.63636,0 0,-0.9048 0,0 z m 3.45454,-7.2381 1.72728,0 0,0.9048 -1.72728,0 0,-0.9048 0,0 z"
id="Fill-1-Copy-3"
sketch:type="MSShapeGroup"
inkscape:connector-curvature="0" />
</g>
</g>
<circle
style="fill:#ff8c00;fill-opacity:1"
id="path3337"
cx="22.5"
cy="7.5"
r="7.5" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
id="rect4713"
width="2"
height="7"
x="19.5"
y="4" />
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
id="rect4713-3"
width="2"
height="7"
x="23.5"
y="4" />
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View file

@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30"
height="30"
viewBox="0 0 30 30"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="tab_monitor_stopped.svg">
<metadata
id="metadata15">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Fill 1 Copy 3</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1280"
inkscape:window-height="748"
id="namedview13"
showgrid="false"
showborder="true"
inkscape:zoom="18.366667"
inkscape:cx="15.462795"
inkscape:cy="15.381125"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2"
inkscape:snap-global="true"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-intersection-paths="false"
inkscape:snap-bbox="true"
inkscape:snap-others="false"
inkscape:snap-nodes="false" />
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
<title
id="title4">Fill 1 Copy 3</title>
<desc
id="desc6">Created with Sketch.</desc>
<defs
id="defs8" />
<g
id="Page-1"
sketch:type="MSPage"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="matrix(1.3157895,0,0,1.3157895,2.5,2.4999995)">
<g
id="HIG"
sketch:type="MSArtboardGroup"
transform="translate(-718,-2432)"
style="fill:#ffffff">
<path
d="m 718,2432 19,0 0,0.9048 -19,0 0,-0.9048 0,0 z m 0,18.0952 1.73776,0 1.7267,-0.9047 12.13477,0 1.69775,0.9047 1.70302,0 0,0.9048 -1.70166,0 -1.69911,-0.9048 -12.13593,0 -1.72554,0.8949 L 718,2451 l 0,-0.9048 0,0 z m 18.13636,-17.1904 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m -18.13636,0 0.86364,0 0,17.1904 -0.86364,0 0,-17.1904 0,0 z m 2.59091,1.8095 13.81818,0 0,12.6667 -13.81818,0 0,-12.6667 0,0 z m 0.86364,0.9047 12.0909,0 0,10.8572 -12.0909,0 0,-10.8572 0,0 z m 4.31818,0 3.45454,0 0,2.7143 -3.45454,0 0,-2.7143 0,0 z m -2.59091,9.9524 8.63636,0 0,0.9048 -8.63636,0 0,-0.9048 0,0 z m 3.45454,-7.2381 1.72728,0 0,0.9048 -1.72728,0 0,-0.9048 0,0 z"
id="Fill-1-Copy-3"
sketch:type="MSShapeGroup"
inkscape:connector-curvature="0" />
</g>
</g>
<circle
style="fill:#ec5250;fill-opacity:1"
id="path3337"
cx="22.5"
cy="7.5"
r="7.5" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="M 20.02539,3.6113281 18.611328,5.0253907 21.085937,7.5 18.611328,9.9746094 20.02539,11.388672 22.5,8.9140625 24.974609,11.388672 26.388672,9.9746094 23.914062,7.5 26.388672,5.0253907 24.974609,3.6113281 22.5,6.0859375 20.02539,3.6113281 Z"
id="rect4713-3"
inkscape:connector-curvature="0" />
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="30"
height="30"
viewBox="0 0 30 30"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="tab_settings.svg">
<metadata
id="metadata15">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>Rectangle 2365 Copy 3</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1052"
inkscape:window-height="981"
id="namedview13"
showgrid="false"
inkscape:zoom="12.421053"
inkscape:cx="8.5"
inkscape:cy="9.5"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
<title
id="title4">Rectangle 2365 Copy 3</title>
<desc
id="desc6">Created with Sketch.</desc>
<defs
id="defs8" />
<g
id="Page-1"
sketch:type="MSPage"
style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="matrix(1.3157895,0,0,1.3157895,3.816,2.4999995)">
<g
id="HIG"
sketch:type="MSArtboardGroup"
transform="translate(-427,-2432)"
style="fill:#ffffff">
<path
d="m 436,2450 8,0 0,1 -8,0 0,-1 z m 0,-2 7,0 0,1 -7,0 0,-1 z m 0,-2 6,0 0,1 -6,0 0,-1 z m 0,-2 5,0 0,1 -5,0 0,-1 z m 0,-2 4,0 0,1 -4,0 0,-1 z m 0,-2 3,0 0,1 -3,0 0,-1 z m 0,-2 2,0 0,1 -2,0 0,-1 z m 0,-2 4,0 0,1 -4,0 0,-1 z m 0,-2 6,0 0,1 -6,0 0,-1 z m 0,-2 8,0 0,1 -8,0 0,-1 z m -9,0 6,6.5 -6,12.5 8,0 0,-19 -8,0 z"
id="Rectangle-2365-Copy-3"
sketch:type="MSShapeGroup"
style="fill:#ffffff"
inkscape:connector-curvature="0" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -44,6 +44,56 @@ QtObject {
} }
} }
property Component sidebar_header_tab: Component {
ButtonStyle {
background: Item {
implicitWidth: Theme.getSize("button").width;
implicitHeight: Theme.getSize("button").height;
Rectangle {
id: buttonFace;
anchors.fill: parent;
property bool down: control.pressed || (control.checkable && control.checked);
color: {
if(control.pressed || (control.checkable && control.checked)) {
return Theme.getColor("sidebar_header_active");
} else if(control.hovered) {
return Theme.getColor("sidebar_header_hover");
} else {
return Theme.getColor("sidebar_header_bar");
}
}
Behavior on color { ColorAnimation { duration: 50; } }
Rectangle {
id: underline;
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: UM.Theme.getSize("sidebar_header_highlight").height
color: control.checked ? UM.Theme.getColor("sidebar_header_highlight") : UM.Theme.getColor("sidebar_header_highlight_hover")
visible: control.hovered || control.checked
}
}
}
label: Item {
Image {
anchors.centerIn: parent;
opacity: !control.enabled ? 0.2 : 1.0
source: control.iconSource;
width: Theme.getSize("button_icon").width;
height: Theme.getSize("button_icon").height;
sourceSize: Theme.getSize("button_icon")
}
}
}
}
property Component tool_button: Component { property Component tool_button: Component {
ButtonStyle { ButtonStyle {
background: Item { background: Item {

View file

@ -38,6 +38,7 @@
"colors": { "colors": {
"sidebar": [255, 255, 255, 255], "sidebar": [255, 255, 255, 255],
"lining": [127, 127, 127, 255], "lining": [127, 127, 127, 255],
"viewport_overlay": [24, 41, 77, 255],
"primary": [12, 169, 227, 255], "primary": [12, 169, 227, 255],
"primary_hover": [48, 182, 231, 255], "primary_hover": [48, 182, 231, 255],
@ -55,6 +56,10 @@
"error": [255, 140, 0, 255], "error": [255, 140, 0, 255],
"sidebar_header_bar": [24, 41, 77, 255], "sidebar_header_bar": [24, 41, 77, 255],
"sidebar_header_active": [70, 84, 113, 255],
"sidebar_header_hover": [24, 41, 77, 255],
"sidebar_header_highlight": [12, 169, 227, 255],
"sidebar_header_highlight_hover": [255, 255, 255, 255],
"sidebar_lining": [245, 245, 245, 255], "sidebar_lining": [245, 245, 245, 255],
"button": [24, 41, 77, 255], "button": [24, 41, 77, 255],
@ -153,10 +158,17 @@
"message_text": [32, 166, 219, 255], "message_text": [32, 166, 219, 255],
"message_dismiss": [127, 127, 127, 255], "message_dismiss": [127, 127, 127, 255],
"tool_panel_background": [255, 255, 255, 255] "tool_panel_background": [255, 255, 255, 255],
"status_offline": [0, 0, 0, 255],
"status_ready": [0, 205, 0, 255],
"status_busy": [12, 169, 227, 255],
"status_paused": [255, 140, 0, 255],
"status_stopped": [236, 82, 80, 255]
}, },
"sizes": { "sizes": {
"window_minimum_size": [70, 54],
"window_margin": [1.0, 1.0], "window_margin": [1.0, 1.0],
"default_margin": [1.0, 1.0], "default_margin": [1.0, 1.0],
"default_lining": [0.08, 0.08], "default_lining": [0.08, 0.08],
@ -165,6 +177,7 @@
"sidebar": [35.0, 10.0], "sidebar": [35.0, 10.0],
"sidebar_header": [0.0, 4.0], "sidebar_header": [0.0, 4.0],
"sidebar_header_highlight": [0.5, 0.5],
"sidebar_header_mode_toggle": [0.0, 2.0], "sidebar_header_mode_toggle": [0.0, 2.0],
"sidebar_lining": [0.5, 0.5], "sidebar_lining": [0.5, 0.5],
"sidebar_setup": [0.0, 2.0], "sidebar_setup": [0.0, 2.0],