Skip to content

Commit d1d98b6

Browse files
Robert0MartRoberto MartinsHugoCLSC
authored
changed load single gate logic (#244)
## Description - [X] Refactor **BlocksScreen/lib/panels/filamentTab.py** - add skip button on pre-gate popup (uses default values) - add force show and set for pre-gate popup - bugfix resets information each accept - no longer open pre-gate popup when single gate **BlocksScreen/lib/panels/widgets/basicFilamentPanel.py** - opens pre-gate popup AFTER user selected Material and then loads --------- Co-authored-by: Roberto Martins <roberto.martins@blockstec.com> Co-authored-by: Hugo Costa <hugo.santos.costa@gmail.com>
1 parent 8da0459 commit d1d98b6

2 files changed

Lines changed: 105 additions & 19 deletions

File tree

BlocksScreen/lib/panels/filamentTab.py

Lines changed: 77 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,25 @@
22
from collections import deque
33
from typing import Deque
44

5-
from PyQt6 import QtCore, QtGui, QtWidgets
6-
75
from devices.amu import AMUManager
86
from devices.amu.models import GateStatus
97
from lib.panels.widgets.addFilamentPage import AddFilamentPage
108
from lib.panels.widgets.addSpoolPage import AddSpoolPage
119
from lib.panels.widgets.amuPage import AMUpage
12-
from lib.panels.widgets.basicFilamentPanel import BasicFilamentPanel
1310
from lib.panels.widgets.basePopup import BasePopup
11+
from lib.panels.widgets.basicFilamentPanel import BasicFilamentPanel
1412
from lib.panels.widgets.colorWheelWidget import ColorWheelWidget
1513
from lib.panels.widgets.keyboardPage import CustomQwertyKeyboard
1614
from lib.panels.widgets.loadWidget import LoadingOverlayWidget
1715
from lib.panels.widgets.numpadPage import CustomNumpad
16+
from lib.panels.widgets.spoolmanPage import SpoolmanPage
1817
from lib.printer import Printer
1918
from lib.utils.blocks_button import BlocksCustomButton
2019
from lib.utils.blocks_frame import BlocksCustomFrame
2120
from lib.utils.blocks_linedit import BlocksCustomLinEdit
2221
from lib.utils.icon_button import IconButton
2322
from lib.utils.list_model import EntryDelegate, EntryListModel, ListItem
24-
from lib.panels.widgets.spoolmanPage import SpoolmanPage
25-
23+
from PyQt6 import QtCore, QtGui, QtWidgets
2624

2725
logger = logging.getLogger(__name__)
2826

@@ -48,7 +46,7 @@ def __init__(
4846
self.cfg = config
4947
self.amu_manager: AMUManager = amu_manager
5048
self.amu_configured = False
51-
49+
self._popup_callback = None
5250
self.ui = self.setupUi()
5351
self.change_page(self.indexOf(self.ui))
5452

@@ -104,6 +102,7 @@ def __init__(
104102
self._basic_panel.call_load_panel.connect(self.call_load_panel)
105103
self._basic_panel.request_back.connect(self.request_back)
106104
self._basic_panel.request_change_tab.connect(self.request_change_tab)
105+
self._basic_panel.filament_selected.connect(self.open_pregate_popup)
107106
self.amu_manager.mmu_state_changed.connect(
108107
self._basic_panel.on_mmu_state_changed
109108
)
@@ -228,8 +227,7 @@ def _field():
228227

229228
self._popup_name.setPlaceholderText("e.g. PLA Generic")
230229
self._popup_color.setText("ffffff")
231-
self._popup_material.setText("PLA")
232-
self._popup_temp.setText("220")
230+
self._popup_temp.setText("250")
233231

234232
self._popup_name.clicked.connect(
235233
lambda: self._on_show_keyboard(self._popup_name)
@@ -278,12 +276,22 @@ def _update_swatch():
278276
self.spoolman_btn.clicked.connect(self._on_spoolman_clicked)
279277
btn_row.addWidget(self.spoolman_btn)
280278

279+
skip_btn = BlocksCustomButton(page)
280+
skip_btn.setFixedSize(230, 80)
281+
skip_btn.setText("Skip")
282+
skip_btn.setFont(font)
283+
skip_btn.clicked.connect(self.handle_skip_button)
284+
skip_btn.setPixmap(
285+
QtGui.QPixmap(":/arrow_icons/media/btn_icons/right_arrow.svg")
286+
)
287+
btn_row.addWidget(skip_btn)
288+
281289
accept_btn = BlocksCustomButton(page)
282290
accept_btn.setFixedSize(230, 80)
283291
accept_btn.setText("Accept")
284292
accept_btn.setFont(font)
285-
accept_btn.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg"))
286293
accept_btn.clicked.connect(self.on_popup_accept)
294+
accept_btn.setPixmap(QtGui.QPixmap(":/dialog/media/btn_icons/yes.svg"))
287295
btn_row.addWidget(accept_btn)
288296

289297
root.addLayout(btn_row)
@@ -413,23 +421,57 @@ def _build_spool_page(self) -> QtWidgets.QWidget:
413421
root.addWidget(frame, 1)
414422
return page
415423

416-
def handle_popup(self):
417-
"""Handles showing the popup for pre-gate filament detection. If multiple gates trigger, they will be queued and shown one at a time."""
424+
def handle_skip_button(self):
425+
gate = self.pre_gate_idx.get("gate", 0)
426+
self.popup.hide()
427+
self._reset_popup()
428+
self.run_gcode.emit(
429+
f"MMU_GATE_MAP GATE={gate} MATERIAL=N/A NAME=N/A COLOR=FFFFFF SPOOLID=-1 TEMP=250 QUIET=1"
430+
)
431+
if self._popup_callback is not None:
432+
try:
433+
self._popup_callback()
434+
except Exception as e:
435+
logger.error(f"Error executing pre-gate accept callback: {e}")
436+
finally:
437+
self._popup_callback = None
438+
439+
def handle_popup(self, force=False):
440+
"""Handles showing the popup for pre-gate filament detection.
441+
If multiple gates trigger, they will be queued and shown one at a time.
442+
443+
Args:
444+
force (bool): If True, forces the popup to open even if no gates are queued.
445+
"""
418446
if self.popup.isVisible():
419447
return
420448
if not self.popup_gates:
421-
return
422-
self.pre_gate_idx = self.popup_gates.popleft()
423-
gate = self.pre_gate_idx["gate"]
424-
self._popup_title_lbl.setText(f"Filament Detected — Gate {gate}")
449+
if force:
450+
self.pre_gate_idx = {"gate": 0}
451+
self._popup_title_lbl.setText("Load filament information")
452+
else:
453+
return
454+
else:
455+
self.pre_gate_idx = self.popup_gates.popleft()
456+
gate = self.pre_gate_idx.get("gate", -1)
457+
self._popup_title_lbl.setText(f"Filament Detected — Gate {gate}")
458+
425459
self._popup_stack.setCurrentIndex(0)
426460
self._selected_spool_id = -2
427461
self.popup.show()
428462

463+
@QtCore.pyqtSlot(int, str, str, "PyQt_PyObject", name="open-pregate-popup")
464+
def open_pregate_popup(self, temp, material, name, callback=None):
465+
self._popup_name.setText(name)
466+
self._popup_material.setText(material)
467+
self._popup_temp.setText(str(temp))
468+
self._popup_callback = callback
469+
self.handle_popup(True)
470+
429471
def on_popup_accept(self):
430472
"""Handles the accept action from the pre-gate popup to send the appropriate G-code to map the gate to the spool."""
431-
gate = self.pre_gate_idx["gate"]
432-
name = self._popup_name.text().strip()
473+
gate = self.pre_gate_idx.get("gate", 0)
474+
name = self._popup_name.text().strip() or "N/A"
433475
color = self._popup_color.text().strip("#").strip()
434476
material = self._popup_material.text().strip()
435477
try:
@@ -452,9 +494,25 @@ def on_popup_accept(self):
452494

453495
self.run_gcode.emit(" ".join(parts))
454496
self.run_gcode.emit("MMU_GATE_MAP REFRESH=1")
497+
498+
if self._popup_callback is not None:
499+
try:
500+
self._popup_callback()
501+
except Exception as e:
502+
logger.error(f"Error executing pre-gate accept callback: {e}")
503+
finally:
504+
self._popup_callback = None
505+
506+
self._reset_popup()
455507
self.popup.hide()
456508
self.handle_popup()
457509

510+
def _reset_popup(self):
511+
self._popup_name.setText("")
512+
self._popup_color.setText("ffffff")
513+
self._popup_material.setText("")
514+
self._popup_temp.setText("250")
515+
458516
@QtCore.pyqtSlot(dict, name="on-spools-received")
459517
def on_spools_received(self, result: dict) -> None:
460518
"""Handles the result from the API call to get spools for the spoolman page."""
@@ -631,7 +689,8 @@ def on_mmu_state_changed(self, mmu_state):
631689
and self._previous_gate_states[gate_info.index] is True
632690
):
633691
self.popup_gates.append({"gate": gate_info.index})
634-
self.handle_popup()
692+
if len(mmu_state.gates) > 1:
693+
self.handle_popup()
635694

636695
if not self.amu_configured:
637696
if len(mmu_state.gates) > 1:

BlocksScreen/lib/panels/widgets/basicFilamentPanel.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class BasicFilamentPanel(QtWidgets.QStackedWidget):
2828
call_load_panel = QtCore.pyqtSignal(bool, str, name="call-load-panel")
2929
request_back = QtCore.pyqtSignal(name="request_back")
3030
request_change_tab = QtCore.pyqtSignal(int, name="request_change_tab")
31+
filament_selected = QtCore.pyqtSignal(
32+
int, str, str, "PyQt_PyObject", name="filament_selected"
33+
)
3134

3235
class FilamentStates(enum.Enum):
3336
UNKNOWN = -1
@@ -46,6 +49,8 @@ def __init__(self, printer: Printer, cfg, parent=None) -> None:
4649
self.target_temp: int = 0
4750
self.current_temp: int = 0
4851
self.has_load_unload_objects = None
52+
self.filament_buttons_list = []
53+
self.mmu_configured = False
4954
self._setupUi()
5055
self.filament_state = self.FilamentStates.UNKNOWN
5156

@@ -206,11 +211,32 @@ def unload_filament(self, toolhead: int = 0, temp: int = 220) -> None:
206211
self.run_gcode.emit(
207212
f"""SAVE_VARIABLE VARIABLE=filament_type VALUE='"{FilamentTypes.UNKNOWN.value.name}"'"""
208213
)
209-
self.run_gcode.emit("MMU_UNLOAD")
214+
self.run_gcode.emit("MMU_LOAD")
215+
216+
def open_pre_gate_popup(self, filament_type: FilamentTypes):
217+
callback_action = partial(self.load_filament, 0, filament_type)
218+
219+
self.filament_selected.emit(
220+
filament_type.value.temperature,
221+
filament_type.value.name,
222+
filament_type.value.name,
223+
callback_action,
224+
)
210225

211226
def on_mmu_state_changed(self, mmu_state):
212227
if mmu_state is None:
213228
return
229+
230+
if not self.mmu_configured:
231+
for btn, _filament_type in self.filament_buttons_list:
232+
try:
233+
btn.clicked.disconnect()
234+
except TypeError:
235+
pass
236+
237+
btn.clicked.connect(partial(self.open_pre_gate_popup, _filament_type))
238+
self.mmu_configured = True
239+
214240
if mmu_state.filament == "Loaded":
215241
self.filament_state = self.FilamentStates.LOADED
216242
else:
@@ -656,6 +682,7 @@ def _setupUi(self):
656682
btn.setProperty("icon_pixmap", QtGui.QPixmap(pixmap_path))
657683
btn.setObjectName(obj_name)
658684
self.load_page_content_layout.addWidget(btn, row, col, 1, 1)
685+
self.filament_buttons_list.append((btn, _filament_type))
659686

660687
self.verticalLayout_2.addLayout(self.load_page_content_layout)
661688

0 commit comments

Comments
 (0)