mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-20 13:17:51 -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")
|
||||
|
||||
def addCommandLineOptions(self, parser):
|
||||
super().addCommandLineOptions(parser)
|
||||
parser.add_argument("file", nargs="*", help="Files to load after starting the application.")
|
||||
|
||||
def run(self):
|
||||
|
|
|
@ -37,6 +37,12 @@ class CuraEngineBackend(Backend):
|
|||
self._scene = Application.getInstance().getController().getScene()
|
||||
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
|
||||
Application.getInstance().activeMachineChanged.connect(self._onActiveMachineChanged)
|
||||
self._onActiveMachineChanged()
|
||||
|
@ -150,7 +156,7 @@ class CuraEngineBackend(Backend):
|
|||
obj = msg.objects.add()
|
||||
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] *= -1
|
||||
obj.vertices = verts.tostring()
|
||||
|
@ -188,8 +194,11 @@ class CuraEngineBackend(Backend):
|
|||
|
||||
def _onSlicedObjectListMessage(self, message):
|
||||
if self._save_polygons:
|
||||
if self._layer_view_active:
|
||||
job = ProcessSlicedObjectListJob.ProcessSlicedObjectListJob(message)
|
||||
job.start()
|
||||
else :
|
||||
self._stored_layer_data = message
|
||||
|
||||
def _onProgressMessage(self, message):
|
||||
if message.amount >= 0.99:
|
||||
|
@ -248,3 +257,14 @@ class CuraEngineBackend(Backend):
|
|||
def _onToolOperationStopped(self, tool):
|
||||
self._enabled = True
|
||||
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._current_layer_num = 10
|
||||
self._current_layer_mesh = None
|
||||
self._activity = False
|
||||
|
||||
self._solid_layers = 5
|
||||
|
||||
def getActivity(self):
|
||||
return self._activity
|
||||
|
||||
def getCurrentLayer(self):
|
||||
return self._current_layer_num
|
||||
|
||||
|
@ -121,6 +125,7 @@ class LayerView(View):
|
|||
scene = self.getController().getScene()
|
||||
renderer = self.getRenderer()
|
||||
if renderer and self._material:
|
||||
self._activity = True
|
||||
renderer.setRenderSelection(False)
|
||||
self._old_max_layers = self._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:
|
||||
self._max_layers = new_max_layers
|
||||
self.maxLayersChanged.emit()
|
||||
self._current_layer_num = self._max_layers
|
||||
|
||||
# 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()
|
||||
currentLayerNumChanged = Signal()
|
||||
|
||||
## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created
|
||||
# as this caused some issues.
|
||||
|
|
|
@ -15,9 +15,11 @@ Item
|
|||
|
||||
Slider
|
||||
{
|
||||
id: slider
|
||||
width: 10
|
||||
height: 250
|
||||
anchors.right : parent.right
|
||||
anchors.rightMargin: UM.Theme.sizes.slider_layerview_margin.width
|
||||
orientation: Qt.Vertical
|
||||
minimumValue: 0;
|
||||
maximumValue: UM.LayerView.numLayers;
|
||||
|
@ -26,6 +28,31 @@ Item
|
|||
value: UM.LayerView.currentLayer
|
||||
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()
|
||||
maxLayersChanged = pyqtSignal()
|
||||
activityChanged = pyqtSignal()
|
||||
|
||||
@pyqtProperty(bool, notify = activityChanged)
|
||||
def getLayerActivity(self):
|
||||
active_view = self._controller.getActiveView()
|
||||
return active_view.getActivity()
|
||||
|
||||
@pyqtProperty(int, notify = maxLayersChanged)
|
||||
def numLayers(self):
|
||||
|
@ -31,8 +37,12 @@ class LayerViewProxy(QObject):
|
|||
if type(active_view) == LayerView.LayerView.LayerView:
|
||||
active_view.setLayer(layer_num)
|
||||
|
||||
def _layerActivityChanged(self):
|
||||
self.activityChanged.emit()
|
||||
|
||||
def _onLayerChanged(self):
|
||||
self.currentLayerChanged.emit()
|
||||
self._layerActivityChanged()
|
||||
|
||||
def _onMaxLayersChanged(self):
|
||||
self.maxLayersChanged.emit()
|
||||
|
|
|
@ -47,6 +47,8 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
|
|||
self.setMenuName("Firmware")
|
||||
self.addMenuItem(i18n_catalog.i18n("Update Firmware"), self.updateAllFirmware)
|
||||
|
||||
Application.getInstance().applicationShuttingDown.connect(self._onApplicationShuttingDown)
|
||||
|
||||
pyqtError = pyqtSignal(str, arguments = ["error"])
|
||||
processingProgress = pyqtSignal(float, arguments = ["amount"])
|
||||
pyqtExtruderTemperature = pyqtSignal(float, arguments = ["amount"])
|
||||
|
@ -170,7 +172,7 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
|
|||
|
||||
## Callback for bed temperature change
|
||||
def onBedTemperature(self, serial_port,temperature):
|
||||
self._bed_temperature = temperature
|
||||
self._bed_temp = temperature
|
||||
self.pyqtBedTemperature.emit(temperature)
|
||||
|
||||
## Callback for error
|
||||
|
@ -280,15 +282,19 @@ class USBPrinterManager(QObject, SignalEmitter, Extension):
|
|||
i = 0
|
||||
while True:
|
||||
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]]
|
||||
i += 1
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
if base_list:
|
||||
else:
|
||||
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
|
||||
|
||||
def _onApplicationShuttingDown(self):
|
||||
for connection in self._printer_connections:
|
||||
connection.close()
|
||||
|
|
|
@ -272,6 +272,7 @@ QtObject {
|
|||
}
|
||||
|
||||
handle: UM.AngledCornerRectangle {
|
||||
id: scrollViewHandle
|
||||
implicitWidth: 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 {
|
||||
TextFieldStyle {
|
||||
textColor: UM.Theme.colors.setting_control_text;
|
||||
|
|
|
@ -100,6 +100,7 @@
|
|||
"slider_groove_fill": [160, 163, 171, 255],
|
||||
"slider_handle": [12, 169, 227, 255],
|
||||
"slider_handle_hover": [34, 150, 190, 255],
|
||||
"slider_text_background": [255, 255, 255, 255],
|
||||
|
||||
"checkbox": [255, 255, 255, 255],
|
||||
"checkbox_hover": [245, 245, 245, 255],
|
||||
|
@ -154,6 +155,10 @@
|
|||
|
||||
"slider_groove": [0.5, 0.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],
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue