diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000000..e62253066b --- /dev/null +++ b/CHANGES @@ -0,0 +1,133 @@ +Cura 15.06 Beta +=============== + +This is the *Beta* version of Cura 15.06. + +Cura 15.06 is a new release built from the ground up on a completely new +framework called Uranium. This framework has been designed to make it easier to +extend Cura with additional functionality as well as provide a cleaner UI. + +Changes since 15.05.91 +---------------------- + +* There is now a working MacOSX version. Currently it supports OSX 10.7 and + higher. +* Fixed: Need to deselect before selecting a different object. +* Fixed: Object can be moved on Z axis. +* Fixed: Error values should be considered invalid values and will not trigger a + slice. +* Fixed: Text fields used a locale-aware validator while the underlying code did + not. +* Fixed: Text fields will trigger a slice on text change, not only after focus + change/enter press. +* Fixed: Rotate Tool snaps to incorrect value. +* Fixed: Object Collision would only moved objects to the right. +* Fixed: Object Collision would move the selected object when it should not. +* Fixed: Camera panning now works correctly instead of doing nothing. +* Fixed: Camera would flip around center point at maximum rotation. +* Fixed: Build platform grid blocked view from below objects. +* Fixed: Viewport on MacOSX with high-DPI screens was only taking 1/4th of the window + +Changes since 15.05.90 +---------------------- + +* Fixed: Additional UI elements for tools and views not loading. +* Fixed: Double click needed to change setting dialog page. +* Fixed: Context menu entries (reload, center object, etc.) not working. +* Fixed: "Open With" or passing files from command line not working. +* Fixed: "Reload All" would not reload files. + +In addition, a lot of work has gone into getting a usable Mac OSX version. + +New Features +------------ + +* Plugin based system + The Uranium framework provides us with a plugin-based system + that provides additional flexibility when extending Cura. Think + of new views, tools, file formats, etc. This is probably the + biggest new feature. +* Improved UI + The UI has received a complete overhaul. +* Time-Quality Slider + The 4 static quick print profiles have been replaced with + a slider that should make it easier to find the right spot + between print time and print quality. +* More Settings + The Advanced mode is now configurable and can show many + additional settings that were previously not available, while at + the same time not overwhelming new users with too many settings. + Custom set of visible settings can be created by the user. +* Support for high-DPI screens + The refreshed UI has been designed with high-DPI screens in + mind which should improve the experience of Cura on such + devices. +* Improved language support + (Not yet available for the Beta release.) +* Improved support structure generation + The new version of the CuraEngine now features improved + support generation algorithms and additional options for support + structure generation. +* Experimental Feature: Wire Printing + Wire Printing has been added as an experimental new feature. It + will print objects as a structure of lines. It can be enabled by + from Advanced Mode -> Fixes -> Wire Printing. +* Undo/Redo + It is now possible to undo and redo most scene operations, like + moving or rotating objects. + +Features from earlier versions not (yet) in this release +-------------------------------------------------------- + +* The All-at-once/One-at-a-time toggle is not available. + We are working on an improved implementation of this mechanism + but it will not be available for this release. +* No dual extrusion features are available yet. + We are working on a completely new workflow for this but this + needs additional time. +* “Lay Flat” has been removed. + The existing implementation was unfortunately not salvageable. + We will be looking into an improved implementation for this + feature. +* "Split Object Into Parts" has been removed. + Due to the same reason as Lay Flat. +* Support for AMF and DAE file formats has been removed. + Both of these will be implemented as plugins in the future. +* Support for directly loading a GCode file is not yet available. + This will be implemented as a plugin in the future. +* Support for PNG, JPG and other image formats has been removed. + These can be supported by a plugin with an improved UI. +* Support for loading Minecraft levels has been removed. + This can be implemented as a plugin. +* Windows XP support has been dropped. + Microsoft is no longer supporting xp, so they no longer back + port certain features that we require. +* X-Ray view is missing. + Will be implemented as a (you might have guessed it) plugin. +* Infill display in the layer view is missing. + Like several other features, the existing implementation of this + functionality is not salvageable and will need to be reimplemented. + + +Known Issues +------------ + +For an up to date list of all known issues, please see +https://github.com/Ultimaker/Cura/issues and +https://github.com/Ultimaker/Uranium/issues . + +* The application has no application icon yet. +* The Windows version starts a console before starting the + application. This is intentional for the beta and it will be + removed for the final version. +* Opening the machine preferences page will switch to the first + available machine instead of keeping the current machine + selected. +* Some OBJ files are rendered as black objects due to missing + normals. +* The developer documentation for Uranium (available at + http://software.ultimaker.com/uranium/index.html) is not yet + complete. +* Disabling plugins does not work correctly yet. +* Unicorn occasionally still requires feeding. Do not feed it + after midnight. diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 85806542f8..97a3888c6e 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -62,7 +62,7 @@ class BuildVolume(SceneNode): self._grid_material.setUniformValue("u_gridColor1", Color(205, 202, 201, 255)) renderer.queueNode(self, material = self._material, mode = Renderer.RenderLines) - renderer.queueNode(self, mesh = self._grid_mesh, material = self._grid_material) + renderer.queueNode(self, mesh = self._grid_mesh, material = self._grid_material, force_single_sided = True) if self._disallowed_area_mesh: renderer.queueNode(self, mesh = self._disallowed_area_mesh, material = self._material) return True @@ -99,10 +99,10 @@ class BuildVolume(SceneNode): mb = MeshBuilder() mb.addQuad( - Vector(minW, minH, maxD), - Vector(maxW, minH, maxD), + Vector(minW, minH, minD), Vector(maxW, minH, minD), - Vector(minW, minH, minD) + Vector(maxW, minH, maxD), + Vector(minW, minH, maxD) ) self._grid_mesh = mb.getData() for n in range(0, 6): diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 8ddf206aea..5e4bd5a415 100644 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -11,6 +11,7 @@ from UM.Math.Float import Float from UM.Math.Vector import Vector from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Application import Application +from UM.Scene.Selection import Selection from . import PlatformPhysicsOperation from . import ConvexHullJob @@ -60,6 +61,8 @@ class PlatformPhysics: job = ConvexHullJob.ConvexHullJob(node) job.start() node._convex_hull_job = job + elif Selection.isSelected(node): + pass else: # Check for collisions between convex hulls for other_node in BreadthFirstIterator(root): @@ -80,8 +83,8 @@ class PlatformPhysics: if overlap is None: continue - move_vector.setX(-overlap[0]) - move_vector.setZ(-overlap[1]) + move_vector.setX(overlap[0] * 1.1) + move_vector.setZ(overlap[1] * 1.1) if move_vector != Vector(): op = PlatformPhysicsOperation.PlatformPhysicsOperation(node, move_vector) diff --git a/cura_app.py b/cura_app.py old mode 100644 new mode 100755 diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 7c52a3c6cb..45a2148892 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -110,6 +110,9 @@ class CuraEngineBackend(Backend): if not objects: return #No point in slicing an empty build plate + if kwargs.get("settings", self._settings).hasErrorValue(): + return #No slicing if we have error values since those are by definition illegal values. + self._slicing = True self.slicingStarted.emit() diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 576feb6cb4..96ff102a14 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -5,6 +5,8 @@ from UM.View.View import View from UM.View.Renderer import Renderer from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Resources import Resources +from UM.Scene.Selection import Selection +from UM.Math.Color import Color ## View used to display g-code paths. class LayerView(View): @@ -23,9 +25,15 @@ class LayerView(View): self._material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "vertexcolor.frag")) self._material.setUniformValue("u_color", [1.0, 0.0, 0.0, 1.0]) + self._selection_material = renderer.createMaterial(Resources.getPath(Resources.ShadersLocation, "basic.vert"), Resources.getPath(Resources.ShadersLocation, "color.frag")) + self._selection_material.setUniformValue("u_color", Color(35, 35, 35, 128)) + for node in DepthFirstIterator(scene.getRoot()): if not node.render(renderer): if node.getMeshData() and node.isVisible(): + if Selection.isSelected(node): + renderer.queueNode(node, material = self._selection_material, transparent = True) + try: layer_data = node.getMeshData().layerData except AttributeError: @@ -43,9 +51,9 @@ class LayerView(View): if layer >= end_layer: break - renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end) + renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, start = start, end = end, overlay = True) else: - renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines) + renderer.queueNode(node, mesh = layer_data, material = self._material, mode = Renderer.RenderLines, overlay = True) def setLayer(self, value): self._layer_percentage = value diff --git a/plugins/USBPrinting/PrinterConnection.py b/plugins/USBPrinting/PrinterConnection.py index 3a953c3744..4a9a73bb7b 100644 --- a/plugins/USBPrinting/PrinterConnection.py +++ b/plugins/USBPrinting/PrinterConnection.py @@ -248,7 +248,10 @@ class PrinterConnection(SignalEmitter): if self._serial is not None: self.setIsConnected(False) - self._listen_thread.join() + try: + self._listen_thread.join() + except: + pass self._serial.close() self._serial = None diff --git a/plugins/USBPrinting/USBPrinterManager.py b/plugins/USBPrinting/USBPrinterManager.py index ba515594ae..27ff31647b 100644 --- a/plugins/USBPrinting/USBPrinterManager.py +++ b/plugins/USBPrinting/USBPrinterManager.py @@ -40,7 +40,8 @@ class USBPrinterManager(QObject, SignalEmitter, Extension): self._error_message = "" ## Add menu item to top menu of the application. - self.addMenuItem(i18n_catalog.i18n("Update Firmware"), self.updateAllFirmware) + self.setMenuName("Firmware") + self.addMenuItem(i18n_catalog.i18n("Update"), self.updateAllFirmware) pyqtError = pyqtSignal(str, arguments = ["amount"]) processingProgress = pyqtSignal(float, arguments = ["amount"]) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 7e48765f17..a2eeba59cd 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -144,23 +144,6 @@ UM.MainWindow { } } - Sidebar { - id: sidebar; - - anchors { - top: parent.top; - bottom: parent.bottom; - right: parent.right; - rightMargin: UM.Theme.sizes.window_margin.width; - } - - width: UM.Theme.sizes.panel.width; - - addMachineAction: actions.addMachine; - configureMachinesAction: actions.configureMachines; - saveAction: actions.save; - } - UM.MessageStack { anchors { left: toolbar.right; @@ -265,6 +248,23 @@ UM.MainWindow { bottomMargin: UM.Theme.sizes.window_margin.height; } } + + Sidebar { + id: sidebar; + + anchors { + top: parent.top; + bottom: parent.bottom; + right: parent.right; + rightMargin: UM.Theme.sizes.window_margin.width; + } + + width: UM.Theme.sizes.panel.width; + + addMachineAction: actions.addMachine; + configureMachinesAction: actions.configureMachines; + saveAction: actions.save; + } } } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 0d4d0df599..3b641a4538 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -16,10 +16,12 @@ UM.AngledCornerRectangle { property alias saveAction: saveButton.saveAction; cornerSize: UM.Theme.sizes.default_margin.width; - + + color: UM.Theme.colors.sidebar; + function showTooltip(item, position, text) { tooltip.text = text; - position = item.mapToItem(base, position.x, position.y); + position = item.mapToItem(base, position.x, position.y / 2); tooltip.show(position); } diff --git a/resources/qml/SidebarTooltip.qml b/resources/qml/SidebarTooltip.qml index 9003faf995..6e0ba74404 100644 --- a/resources/qml/SidebarTooltip.qml +++ b/resources/qml/SidebarTooltip.qml @@ -22,10 +22,10 @@ Rectangle { function show(position) { if(position.y + base.height > parent.height) { - x = position.x; + x = position.x - base.width; y = parent.height - base.height; } else { - x = position.x; + x = position.x - base.width; y = position.y; } base.opacity = 1; diff --git a/resources/settings/fdmprinter.json b/resources/settings/fdmprinter.json index c9eb2c0a49..ea4c59ed7c 100644 --- a/resources/settings/fdmprinter.json +++ b/resources/settings/fdmprinter.json @@ -41,8 +41,9 @@ "unit": "mm", "type": "float", "default": 0.1, - "min_value": 0.06, - "max_value": 2.0, + "min_value": 0.00001, + "min_value_warning": 0.04, + "max_value_warning": 2.0, "always_visible": true, "children": { "layer_height_0": { @@ -51,8 +52,9 @@ "unit": "mm", "type": "float", "default": 0.3, - "min_value": 0.06, - "max_value": 2.0, + "min_value": 0.0, + "min_value_warning": 0.04, + "max_value_warning": 2.0, "visible": false } } diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index d17560d976..dc2b80d2ad 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -73,6 +73,7 @@ QtObject { anchors.horizontalCenter: parent.horizontalCenter; text: control.text; font: UM.Theme.fonts.button_tooltip; + color: UM.Theme.colors.button_tooltip_text; } } } @@ -121,6 +122,8 @@ QtObject { Image { anchors.verticalCenter: parent.verticalCenter; source: control.iconSource; + width: UM.Theme.sizes.section_icon.width; + height: UM.Theme.sizes.section_icon.height; } Label { diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 2ea7f138f6..a79636aece 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -44,6 +44,8 @@ }, "colors": { + "sidebar": [255, 255, 255, 255], + "primary": [12, 169, 227, 255], "primary_hover": [34, 150, 190, 255], "primary_text": [255, 255, 255, 255], @@ -61,6 +63,7 @@ "button_active_hover": [34, 150, 190, 255], "button_text": [255, 255, 255, 255], "button_disabled": [245, 245, 245, 255], + "button_tooltip_text": [35, 35, 35, 255], "scrollbar_background": [245, 245, 245, 255], "scrollbar_handle": [205, 202, 201, 255],