mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-20 21:27:50 -06:00
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:
commit
fec2207b50
8 changed files with 166 additions and 16 deletions
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
@ -121,6 +125,7 @@ class LayerView(View):
|
||||||
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.
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,12 @@ 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):
|
||||||
|
@ -31,8 +37,12 @@ class LayerViewProxy(QObject):
|
||||||
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()
|
||||||
|
|
|
@ -47,6 +47,8 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
|
||||||
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"])
|
||||||
pyqtExtruderTemperature = pyqtSignal(float, arguments = ["amount"])
|
pyqtExtruderTemperature = 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()
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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],
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue