mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 03:46:05 +08:00
Merge branch 'master' of https://github.com/Ultimaker/Cura
This commit is contained in:
commit
6b48072140
@ -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
|
||||||
|
|
||||||
@ -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.
|
||||||
|
@ -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,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()
|
||||||
|
@ -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()
|
||||||
|
@ -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…
x
Reference in New Issue
Block a user