Merge branch 'master' into CURA-5570_beyond_comprehension

This commit is contained in:
Diego Prado Gesto 2018-08-13 09:57:36 +02:00
commit de1b8edb72
51 changed files with 527 additions and 92 deletions

View File

@ -4,15 +4,20 @@ from PyQt5.QtCore import QSize
from UM.Application import Application from UM.Application import Application
class CameraImageProvider(QQuickImageProvider): class CameraImageProvider(QQuickImageProvider):
def __init__(self): def __init__(self):
QQuickImageProvider.__init__(self, QQuickImageProvider.Image) super().__init__(QQuickImageProvider.Image)
## Request a new image. ## Request a new image.
def requestImage(self, id, size): def requestImage(self, id, size):
for output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): for output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices():
try: try:
return output_device.activePrinter.camera.getImage(), QSize(15, 15) image = output_device.activePrinter.camera.getImage()
if image.isNull():
image = QImage()
return image, QSize(15, 15)
except AttributeError: except AttributeError:
pass pass
return QImage(), QSize(15, 15) return QImage(), QSize(15, 15)

View File

@ -226,6 +226,8 @@ class CuraApplication(QtApplication):
self._need_to_show_user_agreement = True self._need_to_show_user_agreement = True
self._plugins_loaded = False
# Backups # Backups
self._auto_save = None self._auto_save = None
self._save_data_enabled = True self._save_data_enabled = True

View File

@ -120,7 +120,7 @@ class PrinterOutputModel(QObject):
@pyqtProperty(QVariant, notify = headPositionChanged) @pyqtProperty(QVariant, notify = headPositionChanged)
def headPosition(self): def headPosition(self):
return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position_z} return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position.z}
def updateHeadPosition(self, x, y, z): def updateHeadPosition(self, x, y, z):
if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z: if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z:

View File

@ -1470,9 +1470,14 @@ class MachineManager(QObject):
if quality_group.node_for_global is None: if quality_group.node_for_global is None:
Logger.log("e", "Could not set quality group [%s] because it has no node_for_global", str(quality_group)) Logger.log("e", "Could not set quality group [%s] because it has no node_for_global", str(quality_group))
return return
# This is not changing the quality for the active machine !!!!!!!!
global_stack.quality = quality_group.node_for_global.getContainer() global_stack.quality = quality_group.node_for_global.getContainer()
for extruder_nr, extruder_stack in global_stack.extruders.items(): for extruder_nr, extruder_stack in global_stack.extruders.items():
extruder_stack.quality = quality_group.nodes_for_extruders[extruder_nr].getContainer() quality_container = self._empty_quality_container
if extruder_nr in quality_group.nodes_for_extruders:
container = quality_group.nodes_for_extruders[extruder_nr].getContainer()
quality_container = container if container is not None else quality_container
extruder_stack.quality = quality_container
return return
self.blurSettings.emit() self.blurSettings.emit()

View File

@ -25,6 +25,9 @@ except ImportError:
import zipfile import zipfile
import UM.Application import UM.Application
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
class ThreeMFWriter(MeshWriter): class ThreeMFWriter(MeshWriter):
def __init__(self): def __init__(self):
@ -173,6 +176,7 @@ class ThreeMFWriter(MeshWriter):
archive.writestr(relations_file, b'<?xml version="1.0" encoding="UTF-8"?> \n' + ET.tostring(relations_element)) archive.writestr(relations_file, b'<?xml version="1.0" encoding="UTF-8"?> \n' + ET.tostring(relations_element))
except Exception as e: except Exception as e:
Logger.logException("e", "Error writing zip file") Logger.logException("e", "Error writing zip file")
self.setInformation(catalog.i18nc("@error:zip", "Error writing 3mf file."))
return False return False
finally: finally:
if not self._store_archive: if not self._store_archive:

View File

@ -1,6 +1,7 @@
# Copyright (c) 2018 Ultimaker B.V. # Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
import argparse #To run the engine in debug mode if the front-end is in debug mode.
from collections import defaultdict from collections import defaultdict
import os import os
from PyQt5.QtCore import QObject, QTimer, pyqtSlot from PyQt5.QtCore import QObject, QTimer, pyqtSlot
@ -179,7 +180,15 @@ class CuraEngineBackend(QObject, Backend):
# \return list of commands and args / parameters. # \return list of commands and args / parameters.
def getEngineCommand(self) -> List[str]: def getEngineCommand(self) -> List[str]:
json_path = Resources.getPath(Resources.DefinitionContainers, "fdmprinter.def.json") json_path = Resources.getPath(Resources.DefinitionContainers, "fdmprinter.def.json")
return [self._application.getPreferences().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, ""] command = [self._application.getPreferences().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, ""]
parser = argparse.ArgumentParser(prog = "cura", add_help = False)
parser.add_argument("--debug", action = "store_true", default = False, help = "Turn on the debug mode by setting this option.")
known_args = vars(parser.parse_known_args()[0])
if known_args["debug"]:
command.append("-vvv")
return command
## Emitted when we get a message containing print duration and material amount. ## Emitted when we get a message containing print duration and material amount.
# This also implies the slicing has finished. # This also implies the slicing has finished.
@ -541,6 +550,9 @@ class CuraEngineBackend(QObject, Backend):
## Remove old layer data (if any) ## Remove old layer data (if any)
def _clearLayerData(self, build_plate_numbers: Set = None) -> None: def _clearLayerData(self, build_plate_numbers: Set = None) -> None:
# Clear out any old gcode
self._scene.gcode_dict = {} # type: ignore
for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax. for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
if node.callDecoration("getLayerData"): if node.callDecoration("getLayerData"):
if not build_plate_numbers or node.callDecoration("getBuildPlateNumber") in build_plate_numbers: if not build_plate_numbers or node.callDecoration("getBuildPlateNumber") in build_plate_numbers:

View File

@ -41,7 +41,7 @@ class StartJobResult(IntEnum):
## Formatter class that handles token expansion in start/end gcode ## Formatter class that handles token expansion in start/end gcode
class GcodeStartEndFormatter(Formatter): class GcodeStartEndFormatter(Formatter):
def get_value(self, key: str, *args: str, default_extruder_nr: str = "-1", **kwargs) -> str: #type: ignore # [CodeStyle: get_value is an overridden function from the Formatter class] def get_value(self, key: str, args: str, kwargs: dict, default_extruder_nr: str = "-1") -> str: #type: ignore # [CodeStyle: get_value is an overridden function from the Formatter class]
# The kwargs dictionary contains a dictionary for each stack (with a string of the extruder_nr as their key), # The kwargs dictionary contains a dictionary for each stack (with a string of the extruder_nr as their key),
# and a default_extruder_nr to use when no extruder_nr is specified # and a default_extruder_nr to use when no extruder_nr is specified

View File

@ -10,6 +10,9 @@ from UM.Mesh.MeshWriter import MeshWriter #The class we're extending/implementin
from UM.PluginRegistry import PluginRegistry from UM.PluginRegistry import PluginRegistry
from UM.Scene.SceneNode import SceneNode #For typing. from UM.Scene.SceneNode import SceneNode #For typing.
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
## A file writer that writes gzipped g-code. ## A file writer that writes gzipped g-code.
# #
# If you're zipping g-code, you might as well use gzip! # If you're zipping g-code, you might as well use gzip!
@ -28,12 +31,15 @@ class GCodeGzWriter(MeshWriter):
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode = MeshWriter.OutputMode.BinaryMode) -> bool: def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode = MeshWriter.OutputMode.BinaryMode) -> bool:
if mode != MeshWriter.OutputMode.BinaryMode: if mode != MeshWriter.OutputMode.BinaryMode:
Logger.log("e", "GCodeGzWriter does not support text mode.") Logger.log("e", "GCodeGzWriter does not support text mode.")
self.setInformation(catalog.i18nc("@error:not supported", "GCodeGzWriter does not support text mode."))
return False return False
#Get the g-code from the g-code writer. #Get the g-code from the g-code writer.
gcode_textio = StringIO() #We have to convert the g-code into bytes. gcode_textio = StringIO() #We have to convert the g-code into bytes.
success = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter")).write(gcode_textio, None) gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter"))
success = gcode_writer.write(gcode_textio, None)
if not success: #Writing the g-code failed. Then I can also not write the gzipped g-code. if not success: #Writing the g-code failed. Then I can also not write the gzipped g-code.
self.setInformation(gcode_writer.getInformation())
return False return False
result = gzip.compress(gcode_textio.getvalue().encode("utf-8")) result = gzip.compress(gcode_textio.getvalue().encode("utf-8"))

View File

@ -12,6 +12,8 @@ from UM.Settings.InstanceContainer import InstanceContainer
from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
## Writes g-code to a file. ## Writes g-code to a file.
# #
@ -62,11 +64,13 @@ class GCodeWriter(MeshWriter):
def write(self, stream, nodes, mode = MeshWriter.OutputMode.TextMode): def write(self, stream, nodes, mode = MeshWriter.OutputMode.TextMode):
if mode != MeshWriter.OutputMode.TextMode: if mode != MeshWriter.OutputMode.TextMode:
Logger.log("e", "GCodeWriter does not support non-text mode.") Logger.log("e", "GCodeWriter does not support non-text mode.")
self.setInformation(catalog.i18nc("@error:not supported", "GCodeWriter does not support non-text mode."))
return False return False
active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
scene = Application.getInstance().getController().getScene() scene = Application.getInstance().getController().getScene()
if not hasattr(scene, "gcode_dict"): if not hasattr(scene, "gcode_dict"):
self.setInformation(catalog.i18nc("@warning:status", "Please generate G-code before saving."))
return False return False
gcode_dict = getattr(scene, "gcode_dict") gcode_dict = getattr(scene, "gcode_dict")
gcode_list = gcode_dict.get(active_build_plate, None) gcode_list = gcode_dict.get(active_build_plate, None)
@ -82,6 +86,7 @@ class GCodeWriter(MeshWriter):
stream.write(settings) stream.write(settings)
return True return True
self.setInformation(catalog.i18nc("@warning:status", "Please generate G-code before saving."))
return False return False
## Create a new container with container 2 as base and container 1 written over it. ## Create a new container with container 2 as base and container 1 written over it.

View File

@ -40,33 +40,37 @@ Item {
property bool layersVisible: true property bool layersVisible: true
function getUpperValueFromSliderHandle () { function getUpperValueFromSliderHandle() {
return upperHandle.getValue() return upperHandle.getValue()
} }
function setUpperValue (value) { function setUpperValue(value) {
upperHandle.setValue(value) upperHandle.setValue(value)
updateRangeHandle() updateRangeHandle()
} }
function getLowerValueFromSliderHandle () { function getLowerValueFromSliderHandle() {
return lowerHandle.getValue() return lowerHandle.getValue()
} }
function setLowerValue (value) { function setLowerValue(value) {
lowerHandle.setValue(value) lowerHandle.setValue(value)
updateRangeHandle() updateRangeHandle()
} }
function updateRangeHandle () { function updateRangeHandle() {
rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height) rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height)
} }
// set the active handle to show only one label at a time // set the active handle to show only one label at a time
function setActiveHandle (handle) { function setActiveHandle(handle) {
activeHandle = handle activeHandle = handle
} }
function normalizeValue(value) {
return Math.min(Math.max(value, sliderRoot.minimumValue), sliderRoot.maximumValue)
}
// slider track // slider track
Rectangle { Rectangle {
id: track id: track
@ -188,6 +192,8 @@ Item {
// set the slider position based on the upper value // set the slider position based on the upper value
function setValue (value) { function setValue (value) {
// Normalize values between range, since using arrow keys will create out-of-the-range values
value = sliderRoot.normalizeValue(value)
UM.SimulationView.setCurrentLayer(value) UM.SimulationView.setCurrentLayer(value)
@ -274,6 +280,8 @@ Item {
// set the slider position based on the lower value // set the slider position based on the lower value
function setValue (value) { function setValue (value) {
// Normalize values between range, since using arrow keys will create out-of-the-range values
value = sliderRoot.normalizeValue(value)
UM.SimulationView.setMinimumLayer(value) UM.SimulationView.setMinimumLayer(value)

View File

@ -29,6 +29,7 @@ Item {
// value properties // value properties
property real maximumValue: 100 property real maximumValue: 100
property real minimumValue: 0
property bool roundValues: true property bool roundValues: true
property real handleValue: maximumValue property real handleValue: maximumValue
@ -47,6 +48,10 @@ Item {
rangeHandle.width = handle.x - sliderRoot.handleSize rangeHandle.width = handle.x - sliderRoot.handleSize
} }
function normalizeValue(value) {
return Math.min(Math.max(value, sliderRoot.minimumValue), sliderRoot.maximumValue)
}
// slider track // slider track
Rectangle { Rectangle {
id: track id: track
@ -110,6 +115,8 @@ Item {
// set the slider position based on the value // set the slider position based on the value
function setValue (value) { function setValue (value) {
// Normalize values between range, since using arrow keys will create out-of-the-range values
value = sliderRoot.normalizeValue(value)
UM.SimulationView.setCurrentPath(value) UM.SimulationView.setCurrentPath(value)

View File

@ -25,10 +25,12 @@ from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
from UM.Settings.SettingInstance import SettingInstance from UM.Settings.SettingInstance import SettingInstance
import numpy
class SupportEraser(Tool): class SupportEraser(Tool):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self._shortcut_key = Qt.Key_G self._shortcut_key = Qt.Key_E
self._controller = self.getController() self._controller = self.getController()
self._selection_pass = None self._selection_pass = None
@ -96,8 +98,7 @@ class SupportEraser(Tool):
node.setName("Eraser") node.setName("Eraser")
node.setSelectable(True) node.setSelectable(True)
mesh = MeshBuilder() mesh = self._createCube(10)
mesh.addCube(10,10,10)
node.setMeshData(mesh.build()) node.setMeshData(mesh.build())
active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
@ -160,3 +161,28 @@ class SupportEraser(Tool):
self._skip_press = False self._skip_press = False
self._had_selection = has_selection self._had_selection = has_selection
def _createCube(self, size):
mesh = MeshBuilder()
# Can't use MeshBuilder.addCube() because that does not get per-vertex normals
# Per-vertex normals require duplication of vertices
s = size / 2
verts = [ # 6 faces with 4 corners each
[-s, -s, s], [-s, s, s], [ s, s, s], [ s, -s, s],
[-s, s, -s], [-s, -s, -s], [ s, -s, -s], [ s, s, -s],
[ s, -s, -s], [-s, -s, -s], [-s, -s, s], [ s, -s, s],
[-s, s, -s], [ s, s, -s], [ s, s, s], [-s, s, s],
[-s, -s, s], [-s, -s, -s], [-s, s, -s], [-s, s, s],
[ s, -s, -s], [ s, -s, s], [ s, s, s], [ s, s, -s]
]
mesh.setVertices(numpy.asarray(verts, dtype=numpy.float32))
indices = []
for i in range(0, 24, 4): # All 6 quads (12 triangles)
indices.append([i, i+2, i+1])
indices.append([i, i+3, i+2])
mesh.setIndices(numpy.asarray(indices, dtype=numpy.int32))
mesh.calculateNormals()
return mesh

View File

@ -29,6 +29,16 @@ Item
anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width width: parent.width
frameVisible: false frameVisible: false
// Workaround for scroll issues (QTBUG-49652)
flickableItem.interactive: false
Component.onCompleted:
{
for (var i = 0; i < flickableItem.children.length; ++i)
{
flickableItem.children[i].enabled = false
}
}
selectionMode: 0 selectionMode: 0
model: packageData.supported_configs model: packageData.supported_configs
headerDelegate: Rectangle headerDelegate: Rectangle

View File

@ -114,7 +114,10 @@ Item
else else
{ {
toolbox.viewPage = "author" toolbox.viewPage = "author"
toolbox.filterModelByProp("packages", "author_id", model.id) toolbox.setFilters("packages", {
"author_id": model.id,
"type": "material"
})
} }
break break
default: default:

View File

@ -105,8 +105,21 @@ Rectangle
switch(toolbox.viewCategory) switch(toolbox.viewCategory)
{ {
case "material": case "material":
toolbox.viewPage = "author"
toolbox.filterModelByProp("packages", "author_name", model.name) // If model has a type, it must be a package
if (model.type !== undefined)
{
toolbox.viewPage = "detail"
toolbox.filterModelByProp("packages", "id", model.id)
}
else
{
toolbox.viewPage = "author"
toolbox.setFilters("packages", {
"author_id": model.id,
"type": "material"
})
}
break break
default: default:
toolbox.viewPage = "detail" toolbox.viewPage = "detail"

View File

@ -776,17 +776,25 @@ class Toolbox(QObject, Extension):
# Filter Models: # Filter Models:
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
@pyqtSlot(str, str, str) @pyqtSlot(str, str, str)
def filterModelByProp(self, modelType: str, filterType: str, parameter: str): def filterModelByProp(self, model_type: str, filter_type: str, parameter: str) -> None:
if not self._models[modelType]: if not self._models[model_type]:
Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", modelType) Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", model_type)
return return
self._models[modelType].setFilter({ filterType: parameter }) self._models[model_type].setFilter({filter_type: parameter})
self.filterChanged.emit() self.filterChanged.emit()
@pyqtSlot() @pyqtSlot(str, "QVariantMap")
def removeFilters(self, modelType: str): def setFilters(self, model_type: str, filter_dict: dict) -> None:
if not self._models[modelType]: if not self._models[model_type]:
Logger.log("w", "Toolbox: Couldn't remove filters on %s model because it doesn't exist.", modelType) Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", model_type)
return return
self._models[modelType].setFilter({}) self._models[model_type].setFilter(filter_dict)
self.filterChanged.emit()
@pyqtSlot(str)
def removeFilters(self, model_type: str) -> None:
if not self._models[model_type]:
Logger.log("w", "Toolbox: Couldn't remove filters on %s model because it doesn't exist.", model_type)
return
self._models[model_type].setFilter({})
self.filterChanged.emit() self.filterChanged.emit()

View File

@ -1,5 +1,6 @@
#Copyright (c) 2018 Ultimaker B.V. #Copyright (c) 2018 Ultimaker B.V.
#Cura is released under the terms of the LGPLv3 or higher. #Cura is released under the terms of the LGPLv3 or higher.
from typing import cast
from Charon.VirtualFile import VirtualFile #To open UFP files. from Charon.VirtualFile import VirtualFile #To open UFP files.
from Charon.OpenMode import OpenMode #To indicate that we want to write to UFP files. from Charon.OpenMode import OpenMode #To indicate that we want to write to UFP files.
@ -13,6 +14,9 @@ from PyQt5.QtCore import QBuffer
from cura.Snapshot import Snapshot from cura.Snapshot import Snapshot
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
class UFPWriter(MeshWriter): class UFPWriter(MeshWriter):
def __init__(self): def __init__(self):
@ -32,7 +36,11 @@ class UFPWriter(MeshWriter):
#Store the g-code from the scene. #Store the g-code from the scene.
archive.addContentType(extension = "gcode", mime_type = "text/x-gcode") archive.addContentType(extension = "gcode", mime_type = "text/x-gcode")
gcode_textio = StringIO() #We have to convert the g-code into bytes. gcode_textio = StringIO() #We have to convert the g-code into bytes.
PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode_textio, None) gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter"))
success = gcode_writer.write(gcode_textio, None)
if not success: #Writing the g-code failed. Then I can also not write the gzipped g-code.
self.setInformation(gcode_writer.getInformation())
return False
gcode = archive.getStream("/3D/model.gcode") gcode = archive.getStream("/3D/model.gcode")
gcode.write(gcode_textio.getvalue().encode("UTF-8")) gcode.write(gcode_textio.getvalue().encode("UTF-8"))
archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode")

View File

@ -30,7 +30,12 @@ Component
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.topMargin: UM.Theme.getSize("default_margin").height
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.right:parent.right
anchors.rightMargin: UM.Theme.getSize("default_margin").width
text: Cura.MachineManager.printerOutputDevices[0].name text: Cura.MachineManager.printerOutputDevices[0].name
elide: Text.ElideRight
} }
Rectangle Rectangle

View File

@ -9,6 +9,7 @@ Component
{ {
Rectangle Rectangle
{ {
id: monitorFrame
width: maximumWidth width: maximumWidth
height: maximumHeight height: maximumHeight
color: UM.Theme.getColor("viewport_background") color: UM.Theme.getColor("viewport_background")
@ -103,5 +104,15 @@ Component
visible: OutputDevice.activePrinter != null visible: OutputDevice.activePrinter != null
anchors.fill:parent anchors.fill:parent
} }
onVisibleChanged:
{
if (!monitorFrame.visible)
{
// After switching the Tab ensure that active printer is Null, the video stream image
// might be active
OutputDevice.setActivePrinter(null)
}
}
} }
} }

View File

@ -299,11 +299,11 @@ Cura.MachineAction
} }
else if (base.selectedDevice.clusterSize === 0) else if (base.selectedDevice.clusterSize === 0)
{ {
return catalog.i18nc("@label", "This printer is not set up to host a group of Ultimaker 3 printers."); return catalog.i18nc("@label", "This printer is not set up to host a group of printers.");
} }
else else
{ {
return catalog.i18nc("@label", "This printer is the host for a group of %1 Ultimaker 3 printers.".arg(base.selectedDevice.clusterSize)); return catalog.i18nc("@label", "This printer is the host for a group of %1 printers.".arg(base.selectedDevice.clusterSize));
} }
} }
@ -349,11 +349,6 @@ Cura.MachineAction
addressField.focus = true; addressField.focus = true;
} }
onAccepted:
{
manager.setManualDevice(printerKey, addressText)
}
Column { Column {
anchors.fill: parent anchors.fill: parent
spacing: UM.Theme.getSize("default_margin").height spacing: UM.Theme.getSize("default_margin").height
@ -393,7 +388,7 @@ Cura.MachineAction
text: catalog.i18nc("@action:button", "OK") text: catalog.i18nc("@action:button", "OK")
onClicked: onClicked:
{ {
manualPrinterDialog.accept() manager.setManualDevice(manualPrinterDialog.printerKey, manualPrinterDialog.addressText)
manualPrinterDialog.hide() manualPrinterDialog.hide()
} }
enabled: manualPrinterDialog.addressText.trim() != "" enabled: manualPrinterDialog.addressText.trim() != ""

View File

@ -89,9 +89,11 @@ Item
MouseArea MouseArea
{ {
anchors.fill: cameraImage anchors.fill: cameraImage
onClicked: { /* no-op */ } onClicked:
z: 1 {
OutputDevice.setActivePrinter(null)
}
z: 1
} }
} }

View File

@ -39,12 +39,12 @@ class SendMaterialJob(Job):
try: try:
remote_materials_list = json.loads(remote_materials_list) remote_materials_list = json.loads(remote_materials_list)
except json.JSONDecodeError: except json.JSONDecodeError:
Logger.log("e", "Current material storage on printer was a corrupted reply.") Logger.log("e", "Request material storage on printer: I didn't understand the printer's answer.")
return return
try: try:
remote_materials_by_guid = {material["guid"]: material for material in remote_materials_list} #Index by GUID. remote_materials_by_guid = {material["guid"]: material for material in remote_materials_list} #Index by GUID.
except KeyError: except KeyError:
Logger.log("e", "Current material storage on printer was an invalid reply (missing GUIDs).") Logger.log("e", "Request material storage on printer: Printer's answer was missing GUIDs.")
return return
container_registry = ContainerRegistry.getInstance() container_registry = ContainerRegistry.getInstance()

View File

@ -198,7 +198,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin):
has_cluster_capable_firmware = Version(system_info["firmware"]) > self._min_cluster_version has_cluster_capable_firmware = Version(system_info["firmware"]) > self._min_cluster_version
instance_name = "manual:%s" % address instance_name = "manual:%s" % address
properties = { properties = {
b"name": system_info["name"].encode("utf-8"), b"name": (system_info["name"] + " (manual)").encode("utf-8"),
b"address": address.encode("utf-8"), b"address": address.encode("utf-8"),
b"firmware_version": system_info["firmware"].encode("utf-8"), b"firmware_version": system_info["firmware"].encode("utf-8"),
b"manual": b"true", b"manual": b"true",

View File

@ -1,4 +1,4 @@
# Copyright (c) 2017 Ultimaker B.V. # Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from UM.Job import Job from UM.Job import Job
@ -21,7 +21,6 @@ class AutoDetectBaudJob(Job):
def run(self): def run(self):
Logger.log("d", "Auto detect baud rate started.") Logger.log("d", "Auto detect baud rate started.")
timeout = 3
wait_response_timeouts = [3, 15, 30] wait_response_timeouts = [3, 15, 30]
wait_bootloader_times = [1.5, 5, 15] wait_bootloader_times = [1.5, 5, 15]
write_timeout = 3 write_timeout = 3
@ -52,7 +51,7 @@ class AutoDetectBaudJob(Job):
if serial is None: if serial is None:
try: try:
serial = Serial(str(self._serial_port), baud_rate, timeout = read_timeout, writeTimeout = write_timeout) serial = Serial(str(self._serial_port), baud_rate, timeout = read_timeout, writeTimeout = write_timeout)
except SerialException as e: except SerialException:
Logger.logException("w", "Unable to create serial") Logger.logException("w", "Unable to create serial")
continue continue
else: else:

View File

@ -15,7 +15,7 @@ from cura.PrinterOutput.GenericOutputController import GenericOutputController
from .AutoDetectBaudJob import AutoDetectBaudJob from .AutoDetectBaudJob import AutoDetectBaudJob
from .avr_isp import stk500v2, intelHex from .avr_isp import stk500v2, intelHex
from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty, QUrl
from serial import Serial, SerialException, SerialTimeoutException from serial import Serial, SerialException, SerialTimeoutException
from threading import Thread, Event from threading import Thread, Event
@ -146,8 +146,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
@pyqtSlot(str) @pyqtSlot(str)
def updateFirmware(self, file): def updateFirmware(self, file):
# the file path is qurl encoded. # the file path could be url-encoded.
self._firmware_location = file.replace("file://", "") if file.startswith("file://"):
self._firmware_location = QUrl(file).toLocalFile()
else:
self._firmware_location = file
self.showFirmwareInterface() self.showFirmwareInterface()
self.setFirmwareUpdateState(FirmwareUpdateState.updating) self.setFirmwareUpdateState(FirmwareUpdateState.updating)
self._update_firmware_thread.start() self._update_firmware_thread.start()

View File

@ -3026,7 +3026,7 @@
{ {
"label": "Initial Layer Print Acceleration", "label": "Initial Layer Print Acceleration",
"description": "The acceleration during the printing of the initial layer.", "description": "The acceleration during the printing of the initial layer.",
"unit": "mm/s", "unit": "mm/s²",
"type": "float", "type": "float",
"default_value": 3000, "default_value": 3000,
"value": "acceleration_layer_0", "value": "acceleration_layer_0",
@ -3040,7 +3040,7 @@
{ {
"label": "Initial Layer Travel Acceleration", "label": "Initial Layer Travel Acceleration",
"description": "The acceleration for travel moves in the initial layer.", "description": "The acceleration for travel moves in the initial layer.",
"unit": "mm/s", "unit": "mm/s²",
"type": "float", "type": "float",
"default_value": 3000, "default_value": 3000,
"value": "acceleration_layer_0 * acceleration_travel / acceleration_print", "value": "acceleration_layer_0 * acceleration_travel / acceleration_print",
@ -5058,7 +5058,7 @@
"description": "The minimum volume for each layer of the prime tower in order to purge enough material.", "description": "The minimum volume for each layer of the prime tower in order to purge enough material.",
"unit": "mm³", "unit": "mm³",
"type": "float", "type": "float",
"default_value": 5, "default_value": 6,
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "((resolveOrValue('prime_tower_size') * 0.5) ** 2 * 3.14159 * resolveOrValue('layer_height') if prime_tower_circular else resolveOrValue('prime_tower_size') ** 2 * resolveOrValue('layer_height')) - sum(extruderValues('prime_tower_min_volume')) + prime_tower_min_volume", "maximum_value_warning": "((resolveOrValue('prime_tower_size') * 0.5) ** 2 * 3.14159 * resolveOrValue('layer_height') if prime_tower_circular else resolveOrValue('prime_tower_size') ** 2 * resolveOrValue('layer_height')) - sum(extruderValues('prime_tower_min_volume')) + prime_tower_min_volume",
"enabled": "resolveOrValue('prime_tower_enable')", "enabled": "resolveOrValue('prime_tower_enable')",

View File

@ -9,6 +9,7 @@
"manufacturer": "TiZYX", "manufacturer": "TiZYX",
"file_formats": "text/x-gcode", "file_formats": "text/x-gcode",
"platform": "tizyx_k25_platform.stl", "platform": "tizyx_k25_platform.stl",
"platform_offset": [0, -4, 0],
"exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pla", "generic_pla_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ], "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pla", "generic_pla_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ],
"preferred_material": "tizyx_pla", "preferred_material": "tizyx_pla",
"has_machine_quality": true, "has_machine_quality": true,

View File

@ -0,0 +1,137 @@
{
"version": 2,
"name": "Winbo Dragon(L)4",
"inherits": "fdmprinter",
"metadata": {
"author": "Winbo",
"manufacturer": "Winbo Smart Tech Co., Ltd.",
"category": "Other",
"visible": true,
"file_formats": "text/x-gcode",
"supports_usb_connection": false,
"machine_extruder_trains":
{
"0": "winbo_dragonl4_extruder"
}
},
"overrides": {
"machine_name": { "default_value": "Winbo Dragon(L)4" },
"machine_width": { "default_value": 615 },
"machine_depth": { "default_value": 463 },
"machine_height": { "default_value": 615 },
"machine_heated_bed": { "default_value": true },
"material_bed_temp_wait": { "default_value": false },
"machine_filament_park_distance": { "value": "machine_heat_zone_length" },
"machine_nozzle_heat_up_speed": { "default_value": 1.4 },
"machine_nozzle_cool_down_speed": { "default_value": 0.8 },
"machine_head_with_fans_polygon":
{
"default_value":
[
[ -50, 90 ],[ -50, -60 ],[ 50, -60 ],[ 50, 90 ]
]
},
"machine_gcode_flavor": { "default_value": "Marlin" },
"machine_max_feedrate_x": { "default_value": 300 },
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_acceleration": { "default_value": 2000 },
"gantry_height": { "default_value": 80 },
"machine_extruder_count": { "default_value": 1 },
"machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nM9998\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F800 X585 E12\nG92 E0" },
"machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" },
"prime_blob_enable": { "enabled": true },
"acceleration_enabled": { "value": "True" },
"acceleration_layer_0": { "value": "acceleration_topbottom" },
"acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
"acceleration_print": { "value": "1800" },
"acceleration_travel": { "value": "2000" },
"acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
"acceleration_support_interface": { "value": "acceleration_topbottom" },
"acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" },
"acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" },
"acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" },
"brim_width": { "value": "4" },
"cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" },
"cool_fan_speed": { "value": "100" },
"cool_fan_speed_max": { "value": "100" },
"cool_min_speed": { "value": "5" },
"fill_outline_gaps": { "value": "True" },
"infill_overlap": { "value": "0" },
"min_infill_area": { "value": "1" },
"min_skin_width_for_expansion": { "value": "2" },
"jerk_enabled": { "value": "True" },
"jerk_layer_0": { "value": "jerk_topbottom" },
"jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" },
"jerk_print": { "value": "25" },
"jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" },
"jerk_support_interface": { "value": "jerk_topbottom" },
"jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" },
"jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" },
"jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" },
"wall_thickness": { "value": "2.4"},
"line_width": { "value": "extruderValue(-1,'machine_nozzle_size')" },
"wall_0_inset": { "value": "0.05" },
"wall_line_width_x": { "value": "line_width" },
"wall_line_width_0": { "value": "line_width-0.05" },
"support_line_width": { "value": "max(min(line_width,0.4),line_width/2)" },
"support_interface_line_width": { "value": "support_line_width" },
"machine_min_cool_heat_time_window": { "value": "15" },
"default_material_print_temperature": { "value": "200" },
"material_print_temperature_layer_0": { "value": "material_print_temperature - 5" },
"material_bed_temperature": { "maximum_value": "100" },
"material_bed_temperature_layer_0": { "maximum_value": "100" },
"raft_airgap": { "value": "0" },
"raft_base_thickness": { "value": "0.3" },
"raft_interface_line_spacing": { "value": "0.5" },
"raft_interface_line_width": { "value": "0.5" },
"raft_interface_thickness": { "value": "0.2" },
"raft_jerk": { "value": "jerk_layer_0" },
"raft_margin": { "value": "5" },
"raft_surface_layers": { "value": "2" },
"retraction_amount": { "value": "4" },
"retraction_count_max": { "value": "10" },
"retraction_extrusion_window": { "value": "1" },
"retraction_hop": { "value": "0.5" },
"retraction_hop_enabled": { "value": "True" },
"retraction_hop_only_when_collides": { "value": "True" },
"retraction_min_travel": { "value": "5" },
"retraction_prime_speed": { "value": "25" },
"skin_overlap": { "value": "10" },
"speed_layer_0": { "value": "25" },
"speed_print": { "value": "70" },
"speed_support": { "value": "speed_print*line_width/support_line_width" },
"speed_support_interface": { "value": "speed_print*line_width/support_interface_line_width" },
"speed_topbottom": { "value": "speed_print*line_width/skin_line_width" },
"speed_travel": { "value": "100" },
"speed_infill": { "value": "speed_print*line_width/infill_line_width" },
"speed_wall": { "value": "speed_print*wall_line_width_0/line_width" },
"speed_wall_0": { "value": "math.ceil(speed_wall * 0.6)" },
"speed_wall_x": { "value": "speed_wall" },
"speed_equalize_flow_enabled": { "value": "False" },
"support_angle": { "value": "50" },
"support_xy_distance": { "value": "1" },
"support_z_distance": { "value": "max((0.2 if(0.2%layer_height==0) else layer_height*int((0.2+layer_height)/layer_height)),layer_height)" },
"support_bottom_distance": { "value": "max(support_z_distance,layer_height*int(0.45/layer_height))" },
"top_bottom_thickness": { "value": "max(1.2,layer_height*6)" },
"travel_avoid_distance": { "value": "3" },
"gradual_support_infill_step_height": { "value": "0.2" },
"gradual_support_infill_steps": { "value": "1" },
"infill_sparse_density": { "value": "20" },
"gradual_infill_step_height": { "value": "1" },
"initial_layer_line_width_factor": { "value": "120" },
"jerk_travel": { "value": "25" },
"support_bottom_enable": { "value": "True" },
"support_bottom_height": { "value": "max((0.15 if(0.15%layer_height==0) else layer_height*int((0.15+layer_height)/layer_height)),layer_height)" },
"support_bottom_pattern": { "value": "'zigzag'" },
"support_connect_zigzags": { "value": "False" },
"support_infill_rate": { "value": "8" },
"support_interface_density": { "value": "80" },
"support_interface_enable": { "value": "True" },
"support_interface_height": { "value": "0.5" },
"support_roof_pattern": { "value": "'concentric'" },
"z_seam_type": { "value": "'shortest'" },
"speed_equalize_flow_max": { "value": "65" }
}
}

View File

@ -0,0 +1,137 @@
{
"version": 2,
"name": "Winbo Mini2",
"inherits": "fdmprinter",
"metadata": {
"author": "Winbo",
"manufacturer": "Winbo Smart Tech Co., Ltd.",
"category": "Other",
"visible": true,
"file_formats": "text/x-gcode",
"supports_usb_connection": true,
"machine_extruder_trains":
{
"0": "winbo_mini2_extruder"
}
},
"overrides": {
"machine_name": { "default_value": "Winbo Mini2" },
"machine_width": { "default_value": 205 },
"machine_depth": { "default_value": 155 },
"machine_height": { "default_value": 205 },
"machine_heated_bed": { "default_value": false },
"material_bed_temp_wait": { "default_value": false },
"machine_filament_park_distance": { "value": "machine_heat_zone_length" },
"machine_nozzle_heat_up_speed": { "default_value": 1.4 },
"machine_nozzle_cool_down_speed": { "default_value": 0.8 },
"machine_head_with_fans_polygon":
{
"default_value":
[
[ -52, 30 ],[ -52, -40 ],[ 13, -40 ],[ 13, 30 ]
]
},
"machine_gcode_flavor": { "default_value": "Marlin" },
"machine_max_feedrate_x": { "default_value": 250 },
"machine_max_feedrate_y": { "default_value": 200 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_acceleration": { "default_value": 3000 },
"gantry_height": { "default_value": 75 },
"machine_extruder_count": { "default_value": 1 },
"machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F1000 Z3\nG1 F4000 X0\nG1 F4000 Y0\nG1 F1000 Z0.2\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." },
"machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" },
"prime_blob_enable": { "enabled": true },
"acceleration_enabled": { "value": "True" },
"acceleration_layer_0": { "value": "acceleration_topbottom" },
"acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
"acceleration_print": { "value": "2000" },
"acceleration_travel": { "value": "2500" },
"acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
"acceleration_support_interface": { "value": "acceleration_topbottom" },
"acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" },
"acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" },
"acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" },
"brim_width": { "value": "3" },
"cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" },
"cool_fan_speed": { "value": "100" },
"cool_fan_speed_max": { "value": "100" },
"cool_min_speed": { "value": "5" },
"fill_outline_gaps": { "value": "True" },
"infill_overlap": { "value": "0" },
"min_infill_area": { "value": "1" },
"min_skin_width_for_expansion": { "value": "2" },
"jerk_enabled": { "value": "True" },
"jerk_layer_0": { "value": "jerk_topbottom" },
"jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" },
"jerk_print": { "value": "25" },
"jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" },
"jerk_support_interface": { "value": "jerk_topbottom" },
"jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" },
"jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" },
"jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" },
"wall_thickness": { "value": "1.2"},
"line_width": { "value": "extruderValue(-1,'machine_nozzle_size')" },
"wall_0_inset": { "value": "0.05" },
"wall_line_width_x": { "value": "line_width" },
"wall_line_width_0": { "value": "line_width-0.05" },
"support_line_width": { "value": "max(min(line_width,0.4),line_width/2)" },
"support_interface_line_width": { "value": "support_line_width" },
"machine_min_cool_heat_time_window": { "value": "15" },
"default_material_print_temperature": { "value": "200" },
"material_print_temperature_layer_0": { "value": "material_print_temperature - 5" },
"material_bed_temperature": { "maximum_value": "115" },
"material_bed_temperature_layer_0": { "maximum_value": "115" },
"raft_airgap": { "value": "0" },
"raft_base_thickness": { "value": "0.3" },
"raft_interface_line_spacing": { "value": "0.5" },
"raft_interface_line_width": { "value": "0.5" },
"raft_interface_thickness": { "value": "0.2" },
"raft_jerk": { "value": "jerk_layer_0" },
"raft_margin": { "value": "10" },
"raft_surface_layers": { "value": "1" },
"retraction_amount": { "value": "4" },
"retraction_count_max": { "value": "10" },
"retraction_extrusion_window": { "value": "1" },
"retraction_hop": { "value": "0.5" },
"retraction_hop_enabled": { "value": "True" },
"retraction_hop_only_when_collides": { "value": "True" },
"retraction_min_travel": { "value": "5" },
"retraction_prime_speed": { "value": "25" },
"skin_overlap": { "value": "10" },
"speed_layer_0": { "value": "20" },
"speed_print": { "value": "50" },
"speed_support": { "value": "speed_print*line_width/support_line_width" },
"speed_support_interface": { "value": "speed_print*line_width/support_interface_line_width" },
"speed_topbottom": { "value": "speed_print*line_width/skin_line_width" },
"speed_travel": { "value": "90" },
"speed_infill": { "value": "speed_print*line_width/infill_line_width" },
"speed_wall": { "value": "speed_print*wall_line_width_0/line_width" },
"speed_wall_0": { "value": "math.ceil(speed_wall * 0.6)" },
"speed_wall_x": { "value": "speed_wall" },
"speed_equalize_flow_enabled": { "value": "False" },
"support_angle": { "value": "50" },
"support_xy_distance": { "value": "1" },
"support_z_distance": { "value": "max((0.2 if(0.2%layer_height==0) else layer_height*int((0.2+layer_height)/layer_height)),layer_height)" },
"support_bottom_distance": { "value": "max(support_z_distance,layer_height*int(0.45/layer_height))" },
"top_bottom_thickness": { "value": "max(1.2,layer_height*6)" },
"travel_avoid_distance": { "value": "3" },
"gradual_support_infill_step_height": { "value": "0.2" },
"gradual_support_infill_steps": { "value": "1" },
"infill_sparse_density": { "value": "20" },
"gradual_infill_step_height": { "value": "1" },
"initial_layer_line_width_factor": { "value": "120" },
"jerk_travel": { "value": "25" },
"support_bottom_enable": { "value": "True" },
"support_bottom_height": { "value": "max((0.15 if(0.15%layer_height==0) else layer_height*int((0.15+layer_height)/layer_height)),layer_height)" },
"support_bottom_pattern": { "value": "'zigzag'" },
"support_connect_zigzags": { "value": "False" },
"support_infill_rate": { "value": "8" },
"support_interface_density": { "value": "80" },
"support_interface_enable": { "value": "True" },
"support_interface_height": { "value": "0.5" },
"support_roof_pattern": { "value": "'concentric'" },
"z_seam_type": { "value": "'shortest'" },
"speed_equalize_flow_max": { "value": "65" }
}
}

View File

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "winbo_dragonl4",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "2"
},
"material_diameter": { "default_value": 3.0 },
"machine_nozzle_size": { "default_value": 0.8 },
"machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 }
}
}

View File

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "winbo_mini2",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0,
"maximum_value": "2"
},
"material_diameter": { "default_value": 1.75 },
"machine_nozzle_size": { "default_value": 0.4 },
"machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 }
}
}

View File

@ -4036,7 +4036,7 @@ msgstr "&Ansicht"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184
msgctxt "@title:menu" msgctxt "@title:menu"
msgid "&Settings" msgid "&Settings"
msgstr "&Einstellungen" msgstr "&Konfiguration"
#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186
msgctxt "@title:menu menubar:toplevel" msgctxt "@title:menu menubar:toplevel"

View File

@ -26,7 +26,6 @@ Column
OutputDeviceHeader OutputDeviceHeader
{ {
width: parent.width
outputDevice: connectedDevice outputDevice: connectedDevice
} }

View File

@ -16,7 +16,7 @@ Item
Rectangle Rectangle
{ {
anchors.fill: parent height: childrenRect.height
color: UM.Theme.getColor("setting_category") color: UM.Theme.getColor("setting_category")
property var activePrinter: outputDevice != null ? outputDevice.activePrinter : null property var activePrinter: outputDevice != null ? outputDevice.activePrinter : null

View File

@ -1,4 +1,4 @@
// Copyright (c) 2015 Ultimaker B.V. // Copyright (c) 2018 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2 import QtQuick 2.2
@ -21,8 +21,8 @@ Item
{ {
id: buttons; id: buttons;
anchors.bottom: parent.bottom; anchors.bottom: parent.bottom
anchors.left: parent.left; anchors.left: parent.left
spacing: UM.Theme.getSize("button_lining").width spacing: UM.Theme.getSize("button_lining").width
Repeater Repeater
@ -34,20 +34,22 @@ Item
height: childrenRect.height height: childrenRect.height
Button Button
{ {
text: model.name text: model.name + (model.shortcut ? (" (" + model.shortcut + ")") : "")
iconSource: (UM.Theme.getIcon(model.icon) != "") ? UM.Theme.getIcon(model.icon) : "file:///" + model.location + "/" + model.icon iconSource: (UM.Theme.getIcon(model.icon) != "") ? UM.Theme.getIcon(model.icon) : "file:///" + model.location + "/" + model.icon
checkable: true checkable: true
checked: model.active checked: model.active
enabled: model.enabled && UM.Selection.hasSelection && UM.Controller.toolsEnabled enabled: model.enabled && UM.Selection.hasSelection && UM.Controller.toolsEnabled
style: UM.Theme.styles.tool_button style: UM.Theme.styles.tool_button
onCheckedChanged: { onCheckedChanged:
if (checked) { {
base.activeY = y if (checked)
{
base.activeY = y;
} }
} }
//Workaround since using ToolButton"s onClicked would break the binding of the checked property, instead //Workaround since using ToolButton's onClicked would break the binding of the checked property, instead
//just catch the click so we do not trigger that behaviour. //just catch the click so we do not trigger that behaviour.
MouseArea MouseArea
{ {
@ -57,7 +59,7 @@ Item
forceActiveFocus() //First grab focus, so all the text fields are updated forceActiveFocus() //First grab focus, so all the text fields are updated
if(parent.checked) if(parent.checked)
{ {
UM.Controller.setActiveTool(null) UM.Controller.setActiveTool(null);
} }
else else
{ {
@ -96,11 +98,13 @@ Item
width: width:
{ {
if (panel.item && panel.width > 0){ if (panel.item && panel.width > 0)
return Math.max(panel.width + 2 * UM.Theme.getSize("default_margin").width) {
return Math.max(panel.width + 2 * UM.Theme.getSize("default_margin").width);
} }
else { else
return 0 {
return 0;
} }
} }
height: panel.item ? panel.height + 2 * UM.Theme.getSize("default_margin").height : 0; height: panel.item ? panel.height + 2 * UM.Theme.getSize("default_margin").height : 0;
@ -124,7 +128,7 @@ Item
x: UM.Theme.getSize("default_margin").width; x: UM.Theme.getSize("default_margin").width;
y: UM.Theme.getSize("default_margin").height; y: UM.Theme.getSize("default_margin").height;
source: UM.ActiveTool.valid ? UM.ActiveTool.activeToolPanel : ""; source: UM.ActiveTool.valid ? UM.ActiveTool.activeToolPanel : ""
enabled: UM.Controller.toolsEnabled; enabled: UM.Controller.toolsEnabled;
} }
} }
@ -148,6 +152,6 @@ Item
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
} }
visible: toolHint.text != ""; visible: toolHint.text != ""
} }
} }

View File

@ -15,8 +15,6 @@ variant = AA 0.25
cool_fan_speed = 40 cool_fan_speed = 40
infill_overlap = 15 infill_overlap = 15
material_final_print_temperature = =material_print_temperature - 5 material_final_print_temperature = =material_print_temperature - 5
prime_tower_size = 12
prime_tower_min_volume = 2
retraction_prime_speed = 25 retraction_prime_speed = 25
speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55)
wall_thickness = 0.92 wall_thickness = 0.92

View File

@ -12,8 +12,6 @@ material = generic_cpe
variant = AA 0.25 variant = AA 0.25
[values] [values]
prime_tower_size = 12
prime_tower_min_volume = 2
retraction_extrusion_window = 0.5 retraction_extrusion_window = 0.5
speed_infill = =math.ceil(speed_print * 40 / 55) speed_infill = =math.ceil(speed_print * 40 / 55)
speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55)

View File

@ -34,7 +34,6 @@ material_standby_temperature = 100
multiple_mesh_overlap = 0.2 multiple_mesh_overlap = 0.2
prime_tower_enable = True prime_tower_enable = True
prime_tower_flow = 100 prime_tower_flow = 100
prime_tower_min_volume = 10
retract_at_layer_change = False retract_at_layer_change = False
retraction_count_max = 12 retraction_count_max = 12
retraction_extra_prime_amount = 0.5 retraction_extra_prime_amount = 0.5

View File

@ -35,7 +35,6 @@ material_standby_temperature = 100
multiple_mesh_overlap = 0.2 multiple_mesh_overlap = 0.2
prime_tower_enable = True prime_tower_enable = True
prime_tower_flow = 100 prime_tower_flow = 100
prime_tower_min_volume = 15
retract_at_layer_change = False retract_at_layer_change = False
retraction_count_max = 12 retraction_count_max = 12
retraction_extra_prime_amount = 0.5 retraction_extra_prime_amount = 0.5

View File

@ -34,7 +34,6 @@ material_standby_temperature = 100
multiple_mesh_overlap = 0.2 multiple_mesh_overlap = 0.2
prime_tower_enable = True prime_tower_enable = True
prime_tower_flow = 100 prime_tower_flow = 100
prime_tower_min_volume = 20
retract_at_layer_change = False retract_at_layer_change = False
retraction_count_max = 12 retraction_count_max = 12
retraction_extra_prime_amount = 0.5 retraction_extra_prime_amount = 0.5

View File

@ -15,8 +15,6 @@ variant = AA 0.25
cool_fan_speed = 40 cool_fan_speed = 40
infill_overlap = 15 infill_overlap = 15
material_final_print_temperature = =material_print_temperature - 5 material_final_print_temperature = =material_print_temperature - 5
prime_tower_size = 12
prime_tower_min_volume = 2
retraction_prime_speed = 25 retraction_prime_speed = 25
speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55)
wall_thickness = 0.92 wall_thickness = 0.92

View File

@ -12,8 +12,6 @@ material = generic_cpe
variant = AA 0.25 variant = AA 0.25
[values] [values]
prime_tower_size = 12
prime_tower_min_volume = 2
retraction_extrusion_window = 0.5 retraction_extrusion_window = 0.5
speed_infill = =math.ceil(speed_print * 40 / 55) speed_infill = =math.ceil(speed_print * 40 / 55)
speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55)

View File

@ -32,7 +32,6 @@ material_standby_temperature = 100
multiple_mesh_overlap = 0.2 multiple_mesh_overlap = 0.2
prime_tower_enable = True prime_tower_enable = True
prime_tower_flow = 100 prime_tower_flow = 100
prime_tower_min_volume = 10
retract_at_layer_change = False retract_at_layer_change = False
retraction_count_max = 12 retraction_count_max = 12
retraction_extra_prime_amount = 0.5 retraction_extra_prime_amount = 0.5

View File

@ -33,7 +33,6 @@ material_standby_temperature = 100
multiple_mesh_overlap = 0.2 multiple_mesh_overlap = 0.2
prime_tower_enable = True prime_tower_enable = True
prime_tower_flow = 100 prime_tower_flow = 100
prime_tower_min_volume = 20
retract_at_layer_change = False retract_at_layer_change = False
retraction_count_max = 12 retraction_count_max = 12
retraction_extra_prime_amount = 0.5 retraction_extra_prime_amount = 0.5

View File

@ -32,7 +32,6 @@ material_standby_temperature = 100
multiple_mesh_overlap = 0.2 multiple_mesh_overlap = 0.2
prime_tower_enable = True prime_tower_enable = True
prime_tower_flow = 100 prime_tower_flow = 100
prime_tower_min_volume = 15
retract_at_layer_change = False retract_at_layer_change = False
retraction_count_max = 12 retraction_count_max = 12
retraction_extra_prime_amount = 0.5 retraction_extra_prime_amount = 0.5

View File

@ -40,7 +40,6 @@ material_print_temperature = =default_material_print_temperature + 10
material_standby_temperature = 100 material_standby_temperature = 100
multiple_mesh_overlap = 0 multiple_mesh_overlap = 0
prime_tower_enable = False prime_tower_enable = False
prime_tower_min_volume = 20
prime_tower_wipe_enabled = True prime_tower_wipe_enabled = True
raft_acceleration = =acceleration_layer_0 raft_acceleration = =acceleration_layer_0
raft_airgap = 0 raft_airgap = 0

View File

@ -22,7 +22,6 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10)
machine_nozzle_heat_up_speed = 1.5 machine_nozzle_heat_up_speed = 1.5
machine_nozzle_id = BB 0.4 machine_nozzle_id = BB 0.4
machine_nozzle_tip_outer_diameter = 1.0 machine_nozzle_tip_outer_diameter = 1.0
prime_tower_min_volume = 15
raft_base_speed = 20 raft_base_speed = 20
raft_interface_speed = 20 raft_interface_speed = 20
raft_speed = 25 raft_speed = 25

View File

@ -40,7 +40,6 @@ material_print_temperature = =default_material_print_temperature + 10
material_standby_temperature = 100 material_standby_temperature = 100
multiple_mesh_overlap = 0 multiple_mesh_overlap = 0
prime_tower_enable = False prime_tower_enable = False
prime_tower_min_volume = 20
prime_tower_wipe_enabled = True prime_tower_wipe_enabled = True
raft_acceleration = =acceleration_layer_0 raft_acceleration = =acceleration_layer_0
raft_airgap = 0 raft_airgap = 0

View File

@ -22,7 +22,6 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10)
machine_nozzle_heat_up_speed = 1.5 machine_nozzle_heat_up_speed = 1.5
machine_nozzle_id = BB 0.4 machine_nozzle_id = BB 0.4
machine_nozzle_tip_outer_diameter = 1.0 machine_nozzle_tip_outer_diameter = 1.0
prime_tower_min_volume = 15
raft_base_speed = 20 raft_base_speed = 20
raft_interface_speed = 20 raft_interface_speed = 20
raft_speed = 25 raft_speed = 25

View File

@ -40,7 +40,6 @@ material_print_temperature = =default_material_print_temperature + 10
material_standby_temperature = 100 material_standby_temperature = 100
multiple_mesh_overlap = 0 multiple_mesh_overlap = 0
prime_tower_enable = False prime_tower_enable = False
prime_tower_min_volume = 20
prime_tower_wipe_enabled = True prime_tower_wipe_enabled = True
raft_acceleration = =acceleration_layer_0 raft_acceleration = =acceleration_layer_0
raft_airgap = 0 raft_airgap = 0

View File

@ -22,7 +22,6 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10)
machine_nozzle_heat_up_speed = 1.5 machine_nozzle_heat_up_speed = 1.5
machine_nozzle_id = BB 0.4 machine_nozzle_id = BB 0.4
machine_nozzle_tip_outer_diameter = 1.0 machine_nozzle_tip_outer_diameter = 1.0
prime_tower_min_volume = 20
raft_base_speed = 20 raft_base_speed = 20
raft_interface_speed = 20 raft_interface_speed = 20
raft_speed = 25 raft_speed = 25