diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c50c56f1d9..c2bf74e321 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -44,6 +44,7 @@ from . import CameraAnimation from . import PrintInformation from . import CuraActions from . import MultiMaterialDecorator +from . import ZOffsetDecorator from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from PyQt5.QtGui import QColor, QIcon @@ -349,14 +350,12 @@ class CuraApplication(QtApplication): continue #Grouped nodes don't need resetting as their parent (the group) is resetted) nodes.append(node) + if nodes: op = GroupedOperation() for node in nodes: - # Ensure that the object is above the build platform - move_distance = node.getBoundingBox().center.y - if move_distance <= 0: - move_distance = -node.getBoundingBox().bottom - op.addOperation(SetTransformOperation(node, Vector(0,move_distance,0))) + node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator) + op.addOperation(SetTransformOperation(node, Vector(0,0,0))) op.push() @@ -378,10 +377,8 @@ class CuraApplication(QtApplication): for node in nodes: # Ensure that the object is above the build platform - move_distance = node.getBoundingBox().center.y - if move_distance <= 0: - move_distance = -node.getBoundingBox().bottom - op.addOperation(SetTransformOperation(node, Vector(0,move_distance,0), Quaternion(), Vector(1, 1, 1))) + node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator) + op.addOperation(SetTransformOperation(node, Vector(0,0,0), Quaternion(), Vector(1, 1, 1))) op.push() @@ -478,17 +475,20 @@ class CuraApplication(QtApplication): group_decorator = GroupDecorator() group_node.addDecorator(group_decorator) group_node.setParent(self.getController().getScene().getRoot()) - + center = Selection.getSelectionCenter() + group_node.setPosition(center) + group_node.setCenterPosition(center) + for node in Selection.getAllSelectedObjects(): + world = node.getWorldPosition() node.setParent(group_node) - group_node.setCenterPosition(group_node.getBoundingBox().center) - #group_node.translate(Vector(0,group_node.getBoundingBox().center.y,0)) - group_node.translate(group_node.getBoundingBox().center) + node.setPosition(world - center) + for node in group_node.getChildren(): Selection.remove(node) - + Selection.add(group_node) - + @pyqtSlot() def ungroupSelected(self): ungrouped_nodes = [] @@ -499,12 +499,11 @@ class CuraApplication(QtApplication): for child in node.getChildren(): if type(child) is SceneNode: children_to_move.append(child) - + for child in children_to_move: + position = child.getWorldPosition() child.setParent(node.getParent()) - print(node.getPosition()) - child.translate(node.getPosition()) - child.setPosition(child.getPosition().scale(node.getScale())) + child.setPosition(position - node.getParent().getWorldPosition()) child.scale(node.getScale()) child.rotate(node.getOrientation()) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 2e4d77b77f..3933802135 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -17,6 +17,7 @@ from cura.ConvexHullDecorator import ConvexHullDecorator from . import PlatformPhysicsOperation from . import ConvexHullJob +from . import ZOffsetDecorator import time import threading @@ -69,8 +70,12 @@ class PlatformPhysics: # Move it downwards if bottom is above platform move_vector = Vector() if not (node.getParent() and node.getParent().callDecoration("isGroup")): #If an object is grouped, don't move it down + z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0 if bbox.bottom > 0: - move_vector.setY(-bbox.bottom) + move_vector.setY(-bbox.bottom + z_offset) + elif bbox.bottom < z_offset: + move_vector.setY((-bbox.bottom) - z_offset) + #if not Float.fuzzyCompare(bbox.bottom, 0.0): # pass#move_vector.setY(-bbox.bottom) @@ -149,5 +154,16 @@ class PlatformPhysics: self._enabled = False def _onToolOperationStopped(self, tool): + if tool.getPluginId() == "TranslateTool": + for node in Selection.getAllSelectedObjects(): + if node.getBoundingBox().bottom < 0: + if not node.getDecorator(ZOffsetDecorator.ZOffsetDecorator): + node.addDecorator(ZOffsetDecorator.ZOffsetDecorator()) + + node.callDecoration("setZOffset", node.getBoundingBox().bottom) + else: + if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator): + node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator) + self._enabled = True self._onChangeTimerFinished() diff --git a/cura/ZOffsetDecorator.py b/cura/ZOffsetDecorator.py new file mode 100644 index 0000000000..54bf64b9a5 --- /dev/null +++ b/cura/ZOffsetDecorator.py @@ -0,0 +1,13 @@ +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator + +## A decorator that stores the amount an object has been moved below the platform. +class ZOffsetDecorator(SceneNodeDecorator): + def __init__(self): + self._z_offset = 0 + + def setZOffset(self, offset): + print("setZOffset", offset) + self._z_offset = offset + + def getZOffset(self): + return self._z_offset diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py index d83466f0c6..4d4c3762f6 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.py +++ b/plugins/ChangeLogPlugin/ChangeLog.py @@ -31,6 +31,7 @@ class ChangeLog(Extension, QObject,): self._change_logs = None Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) Preferences.getInstance().addPreference("general/latest_version_changelog_shown", "15.05.90") #First version of CURA with uranium + self.addMenuItem(catalog.i18nc("@item:inmenu", "Show Changelog"), self.showChangelog) #self.showChangelog() def getChangeLogs(self): @@ -77,8 +78,8 @@ class ChangeLog(Extension, QObject,): def _onEngineCreated(self): if not self._version: return #We're on dev branch. - if self._version > Preferences.getInstance().getValue("general/latest_version_changelog_shown"): - self.showChangelog() + #if self._version > Preferences.getInstance().getValue("general/latest_version_changelog_shown"): + #self.showChangelog() def showChangelog(self): if not self._changelog_window: diff --git a/plugins/ChangeLogPlugin/__init__.py b/plugins/ChangeLogPlugin/__init__.py index 431a93c395..40c0621a63 100644 --- a/plugins/ChangeLogPlugin/__init__.py +++ b/plugins/ChangeLogPlugin/__init__.py @@ -9,7 +9,7 @@ catalog = i18nCatalog("cura") def getMetaData(): return { "plugin": { - "name": catalog.i18nc("@label", "Change Log"), + "name": catalog.i18nc("@label", "Changelog"), "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Shows changes since latest checked version"), diff --git a/plugins/USBPrinting/PrinterConnection.py b/plugins/USBPrinting/PrinterConnection.py index 2a731753fc..e6e54ccbc2 100644 --- a/plugins/USBPrinting/PrinterConnection.py +++ b/plugins/USBPrinting/PrinterConnection.py @@ -123,6 +123,7 @@ class PrinterConnection(OutputDevice, QObject, SignalEmitter): progressChanged = pyqtSignal() extruderTemperatureChanged = pyqtSignal() bedTemperatureChanged = pyqtSignal() + firmwareUpdateComplete = pyqtSignal() endstopStateChanged = pyqtSignal(str ,bool, arguments = ["key","state"]) diff --git a/plugins/USBPrinting/USBPrinterManager.py b/plugins/USBPrinting/USBPrinterManager.py index 1249c454ff..9d9b0b4a02 100644 --- a/plugins/USBPrinting/USBPrinterManager.py +++ b/plugins/USBPrinting/USBPrinterManager.py @@ -54,6 +54,15 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension): addConnectionSignal = Signal() printerConnectionStateChanged = pyqtSignal() + progressChanged = pyqtSignal() + @pyqtProperty(float, notify = progressChanged) + def progress(self): + progress = 0 + for name, connection in self._printer_connections.items(): + progress += connection.progress + + return progress / len(self._printer_connections) + def start(self): self._check_updates = True self._update_thread.start() @@ -91,6 +100,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension): try: self._printer_connections[printer_connection].updateFirmware(Resources.getPath(CuraApplication.ResourceTypes.Firmware, self._getDefaultFirmwareName())) except FileNotFoundError: + Logger.log("w", "No firmware found for printer %s", printer_connection) continue @pyqtSlot(str, result = bool) @@ -154,6 +164,7 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension): connection = PrinterConnection.PrinterConnection(serial_port) connection.connect() connection.connectionStateChanged.connect(self._onPrinterConnectionStateChanged) + connection.progressChanged.connect(self.progressChanged) self._printer_connections[serial_port] = connection def _onPrinterConnectionStateChanged(self, serial_port): @@ -197,4 +208,4 @@ class USBPrinterManager(QObject, SignalEmitter, OutputDevicePlugin, Extension): base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.*") + glob.glob("/dev/tty.usb*") + glob.glob("/dev/rfcomm*") + glob.glob("/dev/serial/by-id/*") return list(base_list) - _instance = None \ No newline at end of file + _instance = None diff --git a/resources/images/cura-icon.png b/resources/images/cura-icon.png index ecfe0d1e4e..8fd6f41691 100644 Binary files a/resources/images/cura-icon.png and b/resources/images/cura-icon.png differ diff --git a/resources/machines/bq_hephestos_2.json b/resources/machines/bq_hephestos_2.json index 7fb2a82f5a..eb79fec1d7 100644 --- a/resources/machines/bq_hephestos_2.json +++ b/resources/machines/bq_hephestos_2.json @@ -39,7 +39,7 @@ "overrides": { "bottom_thickness": { "default": 1.2, "visible": true }, "cool_fan_full_at_height": { "default": 0.8, "visible": false }, - "speed_wall_0": { "default": 35.0, "visible": false }, + "speed_wall_0": { "default": 30.0, "visible": false }, "material_diameter": { "default": 1.75 }, "layer_height_0": { "default": 0.2, "visible": true }, "speed_layer_0": { "default": 35.0, "visible": true }, @@ -53,8 +53,8 @@ "retraction_speed": { "default": 45.0, "visible": false }, "skirt_gap": { "default": 7.0 }, "skirt_line_count": { "default": 4 }, - "speed_infill": { "default": 50.0, "visible": true }, - "material_print_temperature": { "default": 220.0, "visible": true }, + "speed_infill": { "default": 60.0, "visible": true }, + "material_print_temperature": { "default": 210.0, "visible": true }, "speed_topbottom": { "default": 35.0, "visible": false }, "top_thickness": { "default": 1.2, "visible": false }, "top_layers": { "default": 6, "visible": false }, @@ -66,6 +66,6 @@ "support_enable": { "default": false }, "speed_print": { "default": 50.0 }, "skirt_speed": { "default": 35.0, "visible": false }, - "skirt_minimal_length": { "default": 300.0, "visible": false } + "skirt_minimal_length": { "default": 30.0, "visible": false } } } diff --git a/resources/machines/bq_witbox_2.json b/resources/machines/bq_witbox_2.json index a6a0ca07ae..9325e4f531 100644 --- a/resources/machines/bq_witbox_2.json +++ b/resources/machines/bq_witbox_2.json @@ -39,7 +39,7 @@ "overrides": { "bottom_thickness": { "default": 1.2, "visible": true }, "cool_fan_full_at_height": { "default": 0.8, "visible": false }, - "speed_wall_0": { "default": 35.0, "visible": false }, + "speed_wall_0": { "default": 30.0, "visible": false }, "material_diameter": { "default": 1.75 }, "layer_height_0": { "default": 0.2, "visible": true }, "speed_layer_0": { "default": 35.0, "visible": true }, @@ -53,8 +53,8 @@ "retraction_speed": { "default": 45.0, "visible": false }, "skirt_gap": { "default": 7.0 }, "skirt_line_count": { "default": 4 }, - "speed_infill": { "default": 50.0, "visible": true }, - "material_print_temperature": { "default": 220.0, "visible": true }, + "speed_infill": { "default": 60.0, "visible": true }, + "material_print_temperature": { "default": 210.0, "visible": true }, "speed_topbottom": { "default": 35.0, "visible": false }, "top_thickness": { "default": 1.2, "visible": false }, "top_layers": { "default": 6, "visible": false }, @@ -66,6 +66,6 @@ "support_enable": { "default": false }, "speed_print": { "default": 50.0 }, "skirt_speed": { "default": 35.0, "visible": false }, - "skirt_minimal_length": { "default": 300.0, "visible": false } + "skirt_minimal_length": { "default": 30.0, "visible": false } } } diff --git a/resources/machines/fdmprinter.json b/resources/machines/fdmprinter.json index 3c4dcf99f3..c8b1393827 100644 --- a/resources/machines/fdmprinter.json +++ b/resources/machines/fdmprinter.json @@ -497,16 +497,7 @@ "type": "float", "default": 0.1, "visible": false, - "children": { - "infill_sparse_combine": { - "label": "Infill Layers", - "description": "Amount of layers that are combined together to form sparse infill.", - "type": "int", - "default": 1, - "visible": false, - "inherit_function": "math.floor(( parent_value + 0.001) / layer_height)" - } - } + "inherit_function": "layer_height" }, "infill_before_walls": { "label": "Infill Before Walls", diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 9a2a0a5378..ec0cfe16d1 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -47,7 +47,6 @@ Item Action { id:toggleFullScreenAction - shortcut: StandardKey.FullScreen; text: catalog.i18nc("@action:inmenu","Toggle Fu&ll Screen"); iconName: "view-fullscreen"; } diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 6af5c316cc..696b37bdad 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -152,10 +152,6 @@ UM.MainWindow onObjectRemoved: top_view_menu.removeItem(object) } ExclusiveGroup { id: view_menu_top_group; } - - MenuSeparator { } - - MenuItem { action: actions.toggleFullScreen; } } Menu {