Merge branch '15.06'

* 15.06:
  Also add the parent class' command line arguments
  Only process the layer data if the layer view is active.
  Write to the correct variable so bed temperature is properly updated
  Correct a copy-paste error in getConnectionList
  Properly close all open USB connections on shut down
  Catch errors when trying to close the connection thread
  Enlarge the zone where you can use scrolling to look trough the layer mode.
  tiniest detail concerning the padding of the layer count label
  Adds layer count
This commit is contained in:
Arjen Hiemstra 2015-07-10 13:10:15 +02:00
commit fec2207b50
8 changed files with 166 additions and 16 deletions

View file

@ -110,6 +110,7 @@ class CuraApplication(QtApplication):
self._plugin_registry.loadPlugin("CuraEngineBackend") self._plugin_registry.loadPlugin("CuraEngineBackend")
def addCommandLineOptions(self, parser): def addCommandLineOptions(self, parser):
super().addCommandLineOptions(parser)
parser.add_argument("file", nargs="*", help="Files to load after starting the application.") parser.add_argument("file", nargs="*", help="Files to load after starting the application.")
def run(self): def run(self):

View file

@ -37,6 +37,12 @@ class CuraEngineBackend(Backend):
self._scene = Application.getInstance().getController().getScene() self._scene = Application.getInstance().getController().getScene()
self._scene.sceneChanged.connect(self._onSceneChanged) self._scene.sceneChanged.connect(self._onSceneChanged)
# Workaround to disable layer view processing if layer view is not active.
self._layer_view_active = False
Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged)
self._onActiveViewChanged()
self._stored_layer_data = None
self._settings = None self._settings = None
Application.getInstance().activeMachineChanged.connect(self._onActiveMachineChanged) Application.getInstance().activeMachineChanged.connect(self._onActiveMachineChanged)
self._onActiveMachineChanged() self._onActiveMachineChanged()
@ -150,7 +156,7 @@ class CuraEngineBackend(Backend):
obj = msg.objects.add() obj = msg.objects.add()
obj.id = id(object) obj.id = id(object)
verts = numpy.array(mesh_data.getVertices(), copy=True) verts = numpy.array(mesh_data.getVertices())
verts[:,[1,2]] = verts[:,[2,1]] verts[:,[1,2]] = verts[:,[2,1]]
verts[:,1] *= -1 verts[:,1] *= -1
obj.vertices = verts.tostring() obj.vertices = verts.tostring()
@ -188,8 +194,11 @@ class CuraEngineBackend(Backend):
def _onSlicedObjectListMessage(self, message): def _onSlicedObjectListMessage(self, message):
if self._save_polygons: if self._save_polygons:
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message) if self._layer_view_active:
job.start() job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message)
job.start()
else :
self._stored_layer_data = message
def _onProgressMessage(self, message): def _onProgressMessage(self, message):
if message.amount >= 0.99: if message.amount >= 0.99:
@ -248,3 +257,14 @@ class CuraEngineBackend(Backend):
def _onToolOperationStopped(self, tool): def _onToolOperationStopped(self, tool):
self._enabled = True self._enabled = True
self._onChanged() self._onChanged()
def _onActiveViewChanged(self):
if Application.getInstance().getController().getActiveView():
view = Application.getInstance().getController().getActiveView()
if view.getPluginId() == "LayerView":
self._layer_view_active = True
if self._stored_layer_data:
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(self._stored_layer_data)
job.start()
else:
self._layer_view_active = False

View file

@ -27,9 +27,13 @@ class LayerView(View):
self._max_layers = 10 self._max_layers = 10
self._current_layer_num = 10 self._current_layer_num = 10
self._current_layer_mesh = None self._current_layer_mesh = None
self._activity = False
self._solid_layers = 5 self._solid_layers = 5
def getActivity(self):
return self._activity
def getCurrentLayer(self): def getCurrentLayer(self):
return self._current_layer_num return self._current_layer_num
@ -114,13 +118,14 @@ class LayerView(View):
self._current_layer_mesh = None self._current_layer_mesh = None
self.currentLayerNumChanged.emit() self.currentLayerNumChanged.emit()
currentLayerNumChanged = Signal() currentLayerNumChanged = Signal()
def calculateMaxLayers(self): def calculateMaxLayers(self):
scene = self.getController().getScene() scene = self.getController().getScene()
renderer = self.getRenderer() renderer = self.getRenderer()
if renderer and self._material: if renderer and self._material:
self._activity = True
renderer.setRenderSelection(False) renderer.setRenderSelection(False)
self._old_max_layers = self._max_layers self._old_max_layers = self._max_layers
## Recalculate num max layers ## Recalculate num max layers
@ -138,11 +143,14 @@ class LayerView(View):
if new_max_layers > 0 and new_max_layers != self._old_max_layers: if new_max_layers > 0 and new_max_layers != self._old_max_layers:
self._max_layers = new_max_layers self._max_layers = new_max_layers
self.maxLayersChanged.emit() self.maxLayersChanged.emit()
self._current_layer_num = self._max_layers
# This makes sure we update the current layer # This makes sure we update the current layer
self.setLayer(int(self._max_layers * (self._current_layer_num / self._old_max_layers))) self.setLayer(int(self._max_layers))
self.currentLayerNumChanged.emit()
maxLayersChanged = Signal() maxLayersChanged = Signal()
currentLayerNumChanged = Signal()
## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created ## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created
# as this caused some issues. # as this caused some issues.

View file

@ -15,9 +15,11 @@ Item
Slider Slider
{ {
id: slider
width: 10 width: 10
height: 250 height: 250
anchors.right : parent.right anchors.right : parent.right
anchors.rightMargin: UM.Theme.sizes.slider_layerview_margin.width
orientation: Qt.Vertical orientation: Qt.Vertical
minimumValue: 0; minimumValue: 0;
maximumValue: UM.LayerView.numLayers; maximumValue: UM.LayerView.numLayers;
@ -26,6 +28,31 @@ Item
value: UM.LayerView.currentLayer value: UM.LayerView.currentLayer
onValueChanged: UM.LayerView.setCurrentLayer(value) onValueChanged: UM.LayerView.setCurrentLayer(value)
style: UM.Theme.styles.slider; style: UM.Theme.styles.layerViewSlider
}
Rectangle {
anchors.right: parent.right
y: -UM.Theme.sizes.slider_layerview_background_extension.height
z: slider.z - 1
width: UM.Theme.sizes.button.width
height: UM.Theme.sizes.slider_layerview_background_extension.height
color: UM.Theme.colors.slider_text_background
}
UM.AngledCornerRectangle {
anchors.right : parent.right
anchors.verticalCenter: parent.verticalCenter
z: slider.z - 1
cornerSize: UM.Theme.sizes.default_margin.width;
width: UM.Theme.sizes.slider_layerview_background.width
height: slider.height + UM.Theme.sizes.default_margin.height * 2
color: UM.Theme.colors.slider_text_background
MouseArea {
id: sliderMouseArea
property double manualStepSize: slider.maximumValue / 11
anchors.fill: parent
onWheel: {
slider.value = wheel.angleDelta.y < 0 ? slider.value - sliderMouseArea.manualStepSize : slider.value + sliderMouseArea.manualStepSize
}
}
} }
} }

View file

@ -11,7 +11,13 @@ class LayerViewProxy(QObject):
currentLayerChanged = pyqtSignal() currentLayerChanged = pyqtSignal()
maxLayersChanged = pyqtSignal() maxLayersChanged = pyqtSignal()
activityChanged = pyqtSignal()
@pyqtProperty(bool, notify = activityChanged)
def getLayerActivity(self):
active_view = self._controller.getActiveView()
return active_view.getActivity()
@pyqtProperty(int, notify = maxLayersChanged) @pyqtProperty(int, notify = maxLayersChanged)
def numLayers(self): def numLayers(self):
active_view = self._controller.getActiveView() active_view = self._controller.getActiveView()
@ -30,9 +36,13 @@ class LayerViewProxy(QObject):
active_view = self._controller.getActiveView() active_view = self._controller.getActiveView()
if type(active_view) == LayerView.LayerView.LayerView: if type(active_view) == LayerView.LayerView.LayerView:
active_view.setLayer(layer_num) active_view.setLayer(layer_num)
def _layerActivityChanged(self):
self.activityChanged.emit()
def _onLayerChanged(self): def _onLayerChanged(self):
self.currentLayerChanged.emit() self.currentLayerChanged.emit()
self._layerActivityChanged()
def _onMaxLayersChanged(self): def _onMaxLayersChanged(self):
self.maxLayersChanged.emit() self.maxLayersChanged.emit()

View file

@ -46,6 +46,8 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
## Add menu item to top menu of the application. ## Add menu item to top menu of the application.
self.setMenuName("Firmware") self.setMenuName("Firmware")
self.addMenuItem(i18n_catalog.i18n("Update Firmware"), self.updateAllFirmware) self.addMenuItem(i18n_catalog.i18n("Update Firmware"), self.updateAllFirmware)
Application.getInstance().applicationShuttingDown.connect(self._onApplicationShuttingDown)
pyqtError = pyqtSignal(str, arguments = ["error"]) pyqtError = pyqtSignal(str, arguments = ["error"])
processingProgress = pyqtSignal(float, arguments = ["amount"]) processingProgress = pyqtSignal(float, arguments = ["amount"])
@ -170,7 +172,7 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
## Callback for bed temperature change ## Callback for bed temperature change
def onBedTemperature(self, serial_port,temperature): def onBedTemperature(self, serial_port,temperature):
self._bed_temperature = temperature self._bed_temp = temperature
self.pyqtBedTemperature.emit(temperature) self.pyqtBedTemperature.emit(temperature)
## Callback for error ## Callback for error
@ -280,15 +282,19 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
i = 0 i = 0
while True: while True:
values = winreg.EnumValue(key, i) values = winreg.EnumValue(key, i)
if not base_list or "USBSER" in values[0]: if not only_list_usb or "USBSER" in values[0]:
base_list += [values[1]] base_list += [values[1]]
i += 1 i += 1
except Exception as e: except Exception as e:
pass pass
if base_list:
base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.usb*")
base_list = filter(lambda s: "Bluetooth" not in s, base_list) # Filter because mac sometimes puts them in the list
else: else:
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/*") if only_list_usb:
base_list = base_list + glob.glob("/dev/ttyUSB*") + glob.glob("/dev/ttyACM*") + glob.glob("/dev/cu.usb*")
base_list = filter(lambda s: "Bluetooth" not in s, base_list) # Filter because mac sometimes puts them in the list
else:
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 base_list return base_list
def _onApplicationShuttingDown(self):
for connection in self._printer_connections:
connection.close()

View file

@ -272,6 +272,7 @@ QtObject {
} }
handle: UM.AngledCornerRectangle { handle: UM.AngledCornerRectangle {
id: scrollViewHandle
implicitWidth: UM.Theme.sizes.scrollbar.width; implicitWidth: UM.Theme.sizes.scrollbar.width;
cornerSize: UM.Theme.sizes.scrollbar.width; cornerSize: UM.Theme.sizes.scrollbar.width;
@ -367,6 +368,78 @@ QtObject {
} }
} }
property Component layerViewSlider: Component {
SliderStyle {
groove: Rectangle {
id: layerSliderGroove
implicitWidth: control.width;
implicitHeight: UM.Theme.sizes.slider_groove.height;
color: UM.Theme.colors.slider_groove;
border.width: 1;
border.color: UM.Theme.colors.slider_groove_border;
Rectangle {
anchors {
left: parent.left;
top: parent.top;
bottom: parent.bottom;
}
color: UM.Theme.colors.slider_groove_fill;
width: (control.value / (control.maximumValue - control.minimumValue)) * parent.width;
}
Label {
id: maxValueLabel
visible: UM.LayerView.getLayerActivity ? true : false
text: control.maximumValue + 1
font: control.maximumValue > 998 ? UM.Theme.fonts.small : UM.Theme.fonts.default
transformOrigin: Item.BottomLeft
rotation: 90
x: parent.x + parent.width - maxValueLabel.height
y: control.maximumValue > 998 ? parent.y + UM.Theme.sizes.slider_layerview_smalltext_margin.width : parent.y
}
Label {
id: minValueLabel
visible: UM.LayerView.getLayerActivity ? true : false
text: '1'
font: control.maximumValue > 998 ? UM.Theme.fonts.small : UM.Theme.fonts.default
transformOrigin: Item.BottomLeft
rotation: 90
x: parent.x
y: control.maximumValue > 998 ? parent.y + UM.Theme.sizes.slider_layerview_smalltext_margin.width : parent.y
}
}
handle: Rectangle {
id: layerSliderControl
width: UM.Theme.sizes.slider_handle.width;
height: UM.Theme.sizes.slider_handle.height;
color: control.hovered ? UM.Theme.colors.slider_handle_hover : UM.Theme.colors.slider_handle;
Behavior on color { ColorAnimation { duration: 50; } }
Label {
id: valueLabel
visible: UM.LayerView.getLayerActivity ? true : false
text: control.value + 1
anchors.bottom: layerSliderControl.bottom
anchors.right: layerSliderControl.left
anchors.bottomMargin: parent.width + UM.Theme.sizes.default_margin.width
font: UM.Theme.fonts.default
transformOrigin: Item.BottomRight
rotation: 90
Rectangle {
width: (parent.width + UM.Theme.sizes.tooltip_margins.width) < 35 ? 35 : parent.width + UM.Theme.sizes.tooltip_margins.width
height: parent.height + (UM.Theme.sizes.tooltip_margins.height / 2)
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
z: parent.z - 1
color: UM.Theme.colors.slider_text_background
border.width: 1
border.color: UM.Theme.colors.slider_groove_fill;
}
}
}
}
}
property Component text_field: Component { property Component text_field: Component {
TextFieldStyle { TextFieldStyle {
textColor: UM.Theme.colors.setting_control_text; textColor: UM.Theme.colors.setting_control_text;

View file

@ -100,6 +100,7 @@
"slider_groove_fill": [160, 163, 171, 255], "slider_groove_fill": [160, 163, 171, 255],
"slider_handle": [12, 169, 227, 255], "slider_handle": [12, 169, 227, 255],
"slider_handle_hover": [34, 150, 190, 255], "slider_handle_hover": [34, 150, 190, 255],
"slider_text_background": [255, 255, 255, 255],
"checkbox": [255, 255, 255, 255], "checkbox": [255, 255, 255, 255],
"checkbox_hover": [245, 245, 245, 255], "checkbox_hover": [245, 245, 245, 255],
@ -154,6 +155,10 @@
"slider_groove": [0.5, 0.5], "slider_groove": [0.5, 0.5],
"slider_handle": [1.5, 1.5], "slider_handle": [1.5, 1.5],
"slider_layerview_background": [6.0, 0.0],
"slider_layerview_smalltext_margin": [0.3, 0.00],
"slider_layerview_background_extension": [0.0, 2.2],
"slider_layerview_margin": [3.0, 3.0],
"checkbox": [1.5, 1.5], "checkbox": [1.5, 1.5],