testy custom qtdragon zakladka, brak powodzenia
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
# Include your custom_postgui HAL commands here
|
# Plik: custom_postgui.hal
|
||||||
# This file will not be overwritten when you run stepconf again
|
|
||||||
|
|
||||||
|
# Połącz pin z przycisku z sygnałem włączenia wrzeciona
|
||||||
|
# UWAGA: To jest tylko prosty przykład!
|
||||||
|
# Po kliknięciu przycisku, pin HAL zostanie przełączony.
|
||||||
|
# net moj-wlasny-przycisk-signal <= qtdragon_hd.wlasny-przycisk_is-on
|
||||||
166
custom_qtdragon.md
Normal file
166
custom_qtdragon.md
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
# Modyfikacja Interfejsu qtdragon_hd w LinuxCNC
|
||||||
|
|
||||||
|
Data: 2025-12-12
|
||||||
|
|
||||||
|
## 1. Cel
|
||||||
|
|
||||||
|
Głównym celem jest dodanie nowej, niestandardowej zakładki z własnymi przyciskami do interfejsu `qtdragon_hd` w LinuxCNC. Kluczowe założenia to:
|
||||||
|
- Wykorzystanie wbudowanego, ukrytego przycisku `btn_user`, przeznaczonego do tego celu.
|
||||||
|
- Minimalna ingerencja w oryginalne pliki systemowe LinuxCNC.
|
||||||
|
- Stworzenie rozwiązania modułowego, gdzie logika i wygląd nowej zakładki są oddzielone od głównego interfejsu.
|
||||||
|
|
||||||
|
## 2. Podjęte Kroki i Stworzone Pliki
|
||||||
|
|
||||||
|
1. **Analiza i Strategia:** Zidentyfikowaliśmy, że plik `qtdragon_hd.ui` zawiera przycisk `btn_user` i `QStackedWidget` o nazwie `stackedWidget_mainTab`. Zdecydowaliśmy się nie modyfikować tego pliku, a zamiast tego dynamicznie załadować naszą zakładkę za pomocą niestandardowego handlera w Pythonie.
|
||||||
|
|
||||||
|
2. **Stworzenie plików w `~/linuxcnc/configs/mayo-mill_hd/`**:
|
||||||
|
- `qtvcp/screens/qtdragon_hd/qtdragon_hd.ui`: Lokalna kopia domyślnego pliku UI, stworzona w celu uniknięcia modyfikacji pliku systemowego.
|
||||||
|
- `qtvcp/screens/qtdragon_hd/my_user_tab.ui`: Plik UI zawierający *tylko zawartość* naszej nowej zakładki (jeden przycisk testowy).
|
||||||
|
- `qtvcp/screens/qtdragon_hd/handler.py`: Plik Pythona z klasą `MyHandler`, która zawiera logikę ładowania zakładki i obsługi przycisków.
|
||||||
|
- `custom_postgui.hal`: Plik do podłączenia pinów HAL z interfejsu do logiki maszyny.
|
||||||
|
|
||||||
|
3. **Konfiguracja:** Zmodyfikowaliśmy plik `mayo-mill.ini`, dodając w sekcji `[DISPLAY]` wpis: `HANDLER = handler.MyHandler`.
|
||||||
|
|
||||||
|
## 3. Napotkane Problemy i Diagnoza
|
||||||
|
|
||||||
|
1. **Błąd pinu HAL:** Wystąpił błąd `Pin ... does not exist`, ponieważ `custom_postgui.hal` był przetwarzany, zanim handler w Pythonie zdążył utworzyć pin. Problem nasilał się przez użycie kropki w nazwie pinu, która jest znakiem specjalnym w HAL.
|
||||||
|
- **Status:** Problem tymczasowo ominięto przez zakomentowanie linii w `custom_postgui.hal`.
|
||||||
|
|
||||||
|
2. **Główny Problem: Handler nie był ładowany:** Mimo poprawnego wpisu w `.ini`, logi startowe LinuxCNC pokazały, że system ignorował nasz plik `handler.py` i ładował domyślny handler systemowy (`/usr/share/qtvcp/screens/qtdragon_hd/qtdragon_hd_handler.py`).
|
||||||
|
- **Diagnoza:** Nasz plik i klasa `MyHandler` nie były powiązane z domyślnym handlerem. Przez to QTVCP nie traktował go jako rozszerzenia, a jako zupełnie osobny byt, który w tym wypadku został zignorowany na rzecz domyślnej implementacji. Próba zmiany nazwy pliku na `qtdragon_hd_handler.py` spowodowała konflikt i nadpisanie domyślnej logiki, co jest błędne.
|
||||||
|
|
||||||
|
## 4. Poprawne Rozwiązanie (do wdrożenia)
|
||||||
|
|
||||||
|
Aby poprawnie rozszerzyć funkcjonalność `qtdragon_hd`, nasz niestandardowy handler musi **dziedziczyć** po klasie handlera domyślnego. W ten sposób zachowujemy całą oryginalną funkcjonalność i tylko dodajemy naszą własną.
|
||||||
|
|
||||||
|
**Następne kroki do wykonania:**
|
||||||
|
|
||||||
|
1. Zastąpić zawartość pliku `handler.py` poniższym, **poprawionym kodem**, który implementuje dziedziczenie.
|
||||||
|
2. Uruchomić LinuxCNC i zweryfikować, czy zakładka "USER" się pojawiła.
|
||||||
|
3. Opcjonalnie: odkomentować linię w `custom_postgui.hal`, aby przetestować działanie pinu HAL.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Docelowy Kod `handler.py` (z dziedziczeniem)
|
||||||
|
|
||||||
|
```python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Plik: handler.py
|
||||||
|
|
||||||
|
import os
|
||||||
|
# Krok 1: Importujemy domyślny handler qtdragon_hd
|
||||||
|
from qtvcp.screens.qtdragon_hd import qtdragon_hd_handler
|
||||||
|
from qtvcp.core import Info
|
||||||
|
from qtvcp.widgets.widget_base import WidgetBase
|
||||||
|
from PyQt5.QtWidgets import QPushButton
|
||||||
|
|
||||||
|
print(">>> WŁASNY HANDLER: Plik handler.py został załadowany.")
|
||||||
|
|
||||||
|
PATH = Info().get_config_path()
|
||||||
|
|
||||||
|
# Krok 2: Nasza klasa dziedziczy po 'HandlerClass' z domyślnego handlera
|
||||||
|
class MyHandler(qtdragon_hd_handler.HandlerClass):
|
||||||
|
"""
|
||||||
|
Niestandardowy handler, który ROZSZERZA domyślny handler qtdragon_hd.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
# Krok 3: Wywołujemy __init__ klasy nadrzędnej
|
||||||
|
super(MyHandler, self).__init__(*args, **kwargs)
|
||||||
|
print(">>> WŁASNY HANDLER: __init__ wykonany.")
|
||||||
|
|
||||||
|
def initialized(self):
|
||||||
|
# Krok 4: Wywołujemy initialized klasy nadrzędnej, aby cała domyślna logika się wykonała
|
||||||
|
super(MyHandler, self).initialized()
|
||||||
|
print(">>> WŁASNY HANDLER: Metoda 'initialized' została wywołana (po domyślnym handlerze).")
|
||||||
|
|
||||||
|
# --- Od tego momentu zaczyna się nasza własna logika ---
|
||||||
|
|
||||||
|
# Tworzymy nasz własny pin
|
||||||
|
self.my_custom_button_pin = self.hal.newpin("wlasny-przycisk_is-on", "HAL_BIT", "out")
|
||||||
|
print(f">>> WŁASNY HANDLER: Pin HAL '{self.my_custom_button_pin.name}' został stworzony.")
|
||||||
|
|
||||||
|
user_tab_ui_file = os.path.join(PATH, 'qtvcp', 'screens', 'qtdragon_hd', 'my_user_tab.ui')
|
||||||
|
print(f">>> WŁASNY HANDLER: Sprawdzam ścieżkę: {user_tab_ui_file}")
|
||||||
|
|
||||||
|
if not os.path.exists(user_tab_ui_file):
|
||||||
|
print(">>> WŁASNY HANDLER: BŁĄD! Nie znaleziono pliku my_user_tab.ui.")
|
||||||
|
self.widgets.btn_user.setVisible(False)
|
||||||
|
return
|
||||||
|
|
||||||
|
print(">>> WŁASNY HANDLER: Plik my_user_tab.ui znaleziony. Ładuję...")
|
||||||
|
|
||||||
|
self.user_tab_widget = WidgetBase()
|
||||||
|
self.user_tab_widget.load_ui(user_tab_ui_file)
|
||||||
|
|
||||||
|
main_stack = self.widgets.stackedWidget_mainTab
|
||||||
|
user_button = self.widgets.btn_user
|
||||||
|
target_index = user_button.property('index')
|
||||||
|
|
||||||
|
main_stack.insertWidget(target_index, self.user_tab_widget)
|
||||||
|
user_button.setVisible(True)
|
||||||
|
print(f">>> WŁASNY HANDLER: Zakładka wstawiona na indeks {target_index}, przycisk USER widoczny.")
|
||||||
|
|
||||||
|
my_button = self.user_tab_widget.findChild(QPushButton, 'moj_wlasny_przycisk_1')
|
||||||
|
if my_button:
|
||||||
|
my_button.clicked.connect(self.on_my_custom_button_clicked)
|
||||||
|
print(">>> WŁASNY HANDLER: Połączono sygnał z 'moj_wlasny_przycisk_1'.")
|
||||||
|
|
||||||
|
def on_my_custom_button_clicked(self):
|
||||||
|
current_state = self.my_custom_button_pin.get()
|
||||||
|
self.my_custom_button_pin.set(not current_state)
|
||||||
|
print(f">>> WŁASNY HANDLER: Klik! Nowy stan pinu: {not current_state}")
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Plik `my_user_tab.ui`
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>UserTabWidget</class>
|
||||||
|
<widget class="QWidget" name="UserTabWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="moj_wlasny_przycisk_1">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>150</width>
|
||||||
|
<height>50</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Mój Własny Przycisk Testowy</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
|
```
|
||||||
@@ -26,6 +26,7 @@ INTRO_GRAPHIC = linuxcnc.gif
|
|||||||
INTRO_TIME = 5
|
INTRO_TIME = 5
|
||||||
PROGRAM_PREFIX = /home/cnc/linuxcnc/nc_files
|
PROGRAM_PREFIX = /home/cnc/linuxcnc/nc_files
|
||||||
INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
|
INCREMENTS = 5mm 1mm .5mm .1mm .05mm .01mm .005mm
|
||||||
|
HANDLER = handler.MyHandler
|
||||||
|
|
||||||
[KINS]
|
[KINS]
|
||||||
JOINTS = 3
|
JOINTS = 3
|
||||||
|
|||||||
141
qtdragon_hd.pre
Normal file
141
qtdragon_hd.pre
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
[DIALOG_GEOMETRY]
|
||||||
|
AboutDialog-geometry = half
|
||||||
|
LncMessage-geometry = 910 525 280 118
|
||||||
|
ToolChangeDialog-geometry = 910 525 340 237
|
||||||
|
VersaHelpDialog-geometry = default
|
||||||
|
CalculatorDialog-geometry = 910 525 472 376
|
||||||
|
|
||||||
|
[DIALOG_OPTIONS]
|
||||||
|
EntryDialog_play_sound = True
|
||||||
|
EntryDialog_sound_type = READY
|
||||||
|
toolDialog_play_sound = True
|
||||||
|
toolDialog_speak = True
|
||||||
|
toolDialog_sound_type = READY
|
||||||
|
fileDialog_play_sound = True
|
||||||
|
fileDialog_sound_type = READY
|
||||||
|
CalculatorDialog_play_sound = True
|
||||||
|
CalculatorDialog_sound_type = READY
|
||||||
|
MachineLogDialog_play_sound = True
|
||||||
|
MachineLogDialog_sound_type = READY
|
||||||
|
RunFromLineDialog_play_sound = True
|
||||||
|
RunFromLineDialog_sound_type = READY
|
||||||
|
|
||||||
|
[BOOK_KEEPING]
|
||||||
|
last_loaded_directory =
|
||||||
|
last_loaded_file = None
|
||||||
|
style_QSS_Path = DEFAULT
|
||||||
|
|
||||||
|
[ORIGINOFFSET_SYSTEM_NAMES]
|
||||||
|
__dialogOffsetViewWidget-G54 = User System 1
|
||||||
|
__dialogOffsetViewWidget-G55 = User System 2
|
||||||
|
__dialogOffsetViewWidget-G56 = User System 3
|
||||||
|
__dialogOffsetViewWidget-G57 = User System 4
|
||||||
|
__dialogOffsetViewWidget-G58 = User System 5
|
||||||
|
__dialogOffsetViewWidget-G59 = User System 6
|
||||||
|
__dialogOffsetViewWidget-G59.1 = User System 7
|
||||||
|
__dialogOffsetViewWidget-G59.2 = User System 8
|
||||||
|
__dialogOffsetViewWidget-G59.3 = User System 9
|
||||||
|
offset_table-G54 = User System 1
|
||||||
|
offset_table-G55 = User System 2
|
||||||
|
offset_table-G56 = User System 3
|
||||||
|
offset_table-G57 = User System 4
|
||||||
|
offset_table-G58 = User System 5
|
||||||
|
offset_table-G59 = User System 6
|
||||||
|
offset_table-G59.1 = User System 7
|
||||||
|
offset_table-G59.2 = User System 8
|
||||||
|
offset_table-G59.3 = User System 9
|
||||||
|
|
||||||
|
[SCREEN_OPTIONS]
|
||||||
|
catch_errors = True
|
||||||
|
desktop_notify = True
|
||||||
|
notify_max_msgs = 10
|
||||||
|
shutdown_check = True
|
||||||
|
sound_player_on = False
|
||||||
|
MainWindow-geometry = 0 0 1920 1080
|
||||||
|
|
||||||
|
[MCH_MSG_OPTIONS]
|
||||||
|
mchnMsg_play_sound = True
|
||||||
|
mchnMsg_speak_errors = False
|
||||||
|
mchnMsg_speak_text = True
|
||||||
|
mchnMsg_sound_type = ATTENTION
|
||||||
|
|
||||||
|
[USR_MSG_OPTIONS]
|
||||||
|
usermsg_play_sound = True
|
||||||
|
userMsg_sound_type = ATTENTION
|
||||||
|
userMsg_use_focusOverlay = True
|
||||||
|
|
||||||
|
[SHUTDOWN_OPTIONS]
|
||||||
|
shutdown_play_sound = True
|
||||||
|
shutdown_alert_sound_type = READY
|
||||||
|
shutdown_exit_sound_type = LOGOUT
|
||||||
|
shutdown_msg_title = Do you want to Shutdown now?
|
||||||
|
shutdown_msg_focus_text =
|
||||||
|
shutdown_msg_detail =
|
||||||
|
|
||||||
|
[NOTIFY_OPTIONS]
|
||||||
|
notify_start_greeting = False
|
||||||
|
notify_start_title = Welcome
|
||||||
|
notify_start_detail = This option can be changed in the preference file
|
||||||
|
notify_start_timeout = 5
|
||||||
|
|
||||||
|
[FILEMANAGER_JUMPLIST]
|
||||||
|
|
||||||
|
[SCREEN_CONTROL_LAST_SETTING]
|
||||||
|
gcodegraphics-user-view = p
|
||||||
|
gcodegraphics-user-zoom = 10.0
|
||||||
|
gcodegraphics-user-panx = 0.0
|
||||||
|
gcodegraphics-user-pany = 0.0
|
||||||
|
gcodegraphics-user-lat = 0.0
|
||||||
|
gcodegraphics-user-lon = 0.0
|
||||||
|
|
||||||
|
[CUSTOM_FORM_ENTRIES]
|
||||||
|
Tool to load = 0
|
||||||
|
Laser X = 100.0
|
||||||
|
Laser Y = -20.0
|
||||||
|
Sensor X = 10.0
|
||||||
|
Sensor Y = 10.0
|
||||||
|
Camera X = 10.0
|
||||||
|
Camera Y = 10.0
|
||||||
|
Work Height = 20.0
|
||||||
|
Touch Height = 40.0
|
||||||
|
Sensor Height = 40.0
|
||||||
|
Search Velocity = 40.0
|
||||||
|
Probe Velocity = 10.0
|
||||||
|
Max Probe = 10.0
|
||||||
|
Retract Distance = 10.0
|
||||||
|
Z Safe Travel = 10.0
|
||||||
|
Eoffset count = 0
|
||||||
|
External offsets = False
|
||||||
|
Reload program = False
|
||||||
|
Reload tool = False
|
||||||
|
Use keyboard = False
|
||||||
|
Use tool sensor = False
|
||||||
|
Use tool touchplate = False
|
||||||
|
Run from line = False
|
||||||
|
Use virtual keyboard = False
|
||||||
|
Use camera = False
|
||||||
|
Use alpha display mode = False
|
||||||
|
Inhibit display mouse selection = True
|
||||||
|
Camview xscale = 100
|
||||||
|
Camview yscale = 100
|
||||||
|
Camview cam number = 0
|
||||||
|
|
||||||
|
[VERSA_PROBE_OPTIONS]
|
||||||
|
ps_searchvel = 300.0
|
||||||
|
ps_probevel = 10.0
|
||||||
|
ps_z_clearance = 3.0
|
||||||
|
ps_probe_max = 1.0
|
||||||
|
ps_probe_max_z_travel = 1.0
|
||||||
|
ps_probe_latch = 0.5
|
||||||
|
ps_probe_diam = 2.0
|
||||||
|
ps_xy_clearance = 5.0
|
||||||
|
ps_side_edge_length = 5.0
|
||||||
|
ps_probe_height = 20.0
|
||||||
|
ps_block_height = 20.0
|
||||||
|
use_tool_measurement = True
|
||||||
|
ps_offs_x = 0.0
|
||||||
|
ps_offs_y = 0.0
|
||||||
|
ps_offs_z = 0.0
|
||||||
|
ps_offs_angle = 0.0
|
||||||
|
ps_probe_rapid_vel = 60.0
|
||||||
|
|
||||||
78
qtvcp/screens/qtdragon_hd/handler.py
Normal file
78
qtvcp/screens/qtdragon_hd/handler.py
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# handler.py
|
||||||
|
|
||||||
|
import os
|
||||||
|
from qtvcp.core import Handler, Info
|
||||||
|
from qtvcp.widgets.widget_base import WidgetBase
|
||||||
|
from PyQt5.QtWidgets import QPushButton
|
||||||
|
|
||||||
|
print("Plik handler.py został załadowany przez Pythona.")
|
||||||
|
|
||||||
|
# Pobierz sciezke do naszej konfiguracji
|
||||||
|
PATH = Info().get_config_path()
|
||||||
|
|
||||||
|
class MyHandler(Handler):
|
||||||
|
"""
|
||||||
|
Główna klasa handlera, która dynamicznie ładuje zakładkę użytkownika.
|
||||||
|
WERSJA DEBUG.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Metoda __init__ jest wywoływana przy starcie.
|
||||||
|
"""
|
||||||
|
super(MyHandler, self).__init__(*args, **kwargs)
|
||||||
|
print(">>> HANDLER: __init__ został wykonany. Obiekt MyHandler stworzony.")
|
||||||
|
|
||||||
|
# Tworzymy pin HAL dla naszego własnego przycisku
|
||||||
|
self.my_custom_button_pin = self.hal.newpin("wlasny-przycisk_is-on", "HAL_BIT", "out")
|
||||||
|
print(f">>> HANDLER: Pin HAL '{self.my_custom_button_pin.name}' został stworzony.")
|
||||||
|
|
||||||
|
def initialized(self):
|
||||||
|
"""
|
||||||
|
Ta metoda jest wywoływana, gdy interfejs jest już załadowany.
|
||||||
|
Tutaj wczytujemy nasz plik UI i wstawiamy go do stackedWidget.
|
||||||
|
"""
|
||||||
|
print(">>> HANDLER: Metoda 'initialized' została wywołana.")
|
||||||
|
|
||||||
|
# Ścieżka do naszego pliku UI z zawartością zakładki
|
||||||
|
user_tab_ui_file = os.path.join(PATH, 'qtvcp', 'screens', 'qtdragon_hd', 'my_user_tab.ui')
|
||||||
|
print(f">>> HANDLER: Sprawdzam ścieżkę do pliku UI: {user_tab_ui_file}")
|
||||||
|
|
||||||
|
if not os.path.exists(user_tab_ui_file):
|
||||||
|
print(">>> HANDLER: BŁĄD KRYTYCZNY! Nie znaleziono pliku my_user_tab.ui. Przycisk 'USER' nie zostanie aktywowany.")
|
||||||
|
self.widgets.btn_user.setVisible(False)
|
||||||
|
return
|
||||||
|
|
||||||
|
print(">>> HANDLER: Plik my_user_tab.ui ZOSTAŁ ZNALEZIONY. Próbuję go załadować.")
|
||||||
|
|
||||||
|
# Załaduj zawartość z pliku .ui do nowego widżetu
|
||||||
|
self.user_tab_widget = WidgetBase()
|
||||||
|
self.user_tab_widget.load_ui(user_tab_ui_file)
|
||||||
|
print(">>> HANDLER: Plik UI załadowany pomyślnie do widżetu.")
|
||||||
|
|
||||||
|
# Główne QStackedWidget z oryginalnego UI
|
||||||
|
main_stack = self.widgets.stackedWidget_mainTab
|
||||||
|
user_button = self.widgets.btn_user
|
||||||
|
target_index = user_button.property('index')
|
||||||
|
|
||||||
|
# Wstawiamy nasz nowy widżet
|
||||||
|
main_stack.insertWidget(target_index, self.user_tab_widget)
|
||||||
|
print(f">>> HANDLER: Widżet wstawiony do stackedWidget_mainTab na indeksie {target_index}.")
|
||||||
|
|
||||||
|
# Upewnij się, że przycisk USER jest widoczny
|
||||||
|
user_button.setVisible(True)
|
||||||
|
print(">>> HANDLER: Próba ustawienia przycisku 'btn_user' jako WIDOCZNY.")
|
||||||
|
|
||||||
|
# Znajdź nasz własny przycisk w załadowanym widżecie i połącz jego sygnał
|
||||||
|
my_button = self.user_tab_widget.findChild(QPushButton, 'moj_wlasny_przycisk_1')
|
||||||
|
if my_button:
|
||||||
|
my_button.clicked.connect(self.on_my_custom_button_clicked)
|
||||||
|
print(">>> HANDLER: Znaleziono 'moj_wlasny_przycisk_1' i połączono jego sygnał 'clicked'.")
|
||||||
|
else:
|
||||||
|
print(">>> HANDLER: OSTRZEŻENIE: Nie znaleziono przycisku 'moj_wlasny_przycisk_1' w my_user_tab.ui")
|
||||||
|
|
||||||
|
def on_my_custom_button_clicked(self):
|
||||||
|
current_state = self.my_custom_button_pin.get()
|
||||||
|
self.my_custom_button_pin.set(not current_state)
|
||||||
|
print(f">>> HANDLER: Kliknięto własny przycisk! Nowy stan pinu HAL: {not current_state}")
|
||||||
47
qtvcp/screens/qtdragon_hd/my_user_tab.ui
Normal file
47
qtvcp/screens/qtdragon_hd/my_user_tab.ui
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>UserTabWidget</class>
|
||||||
|
<widget class="QWidget" name="UserTabWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="moj_wlasny_przycisk_1">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>150</width>
|
||||||
|
<height>50</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Mój Własny Przycisk Testowy</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
18065
qtvcp/screens/qtdragon_hd/qtdragon_hd.ui
Normal file
18065
qtvcp/screens/qtdragon_hd/qtdragon_hd.ui
Normal file
File diff suppressed because it is too large
Load Diff
14
tool.tbl
14
tool.tbl
@@ -1,7 +1,7 @@
|
|||||||
T0 P0 ;Probe
|
T0 P0 X0 Y0 Z0 A0 B0 C0 U0 V0 W0 D0 I0 J0 Q0 ;Probe
|
||||||
T1 P1 D+0.850000 ;0.85 Flat end mill
|
T1 P1 X0 Y0 Z0 A0 B0 C0 U0 V0 W0 D0.85000 I0 J0 Q0 ;0.85 Flat end mill
|
||||||
T2 P2 D+3.175000 Z-0.012833 ;3.175 Flat end mill
|
T2 P2 X0 Y0 Z-0.01283 A0 B0 C0 U0 V0 W0 D3.17500 I0 J0 Q0 ;3.175 Flat end mill
|
||||||
T3 P3 D+3.175000 ;3.175 Engrave mill 30* 0.2
|
T3 P3 X0 Y0 Z0 A0 B0 C0 U0 V0 W0 D3.17500 I0 J0 Q0 ;3.175 Engrave mill 30* 0.2
|
||||||
T4 P4 D+6.000000 Z+15.800167 ;6mm Flat end mill
|
T4 P4 X0 Y0 Z15.80017 A0 B0 C0 U0 V0 W0 D6.00000 I0 J0 Q0 ;6mm Flat end mill
|
||||||
T5 P0 D+1.000000 Z-0.001500 ;1mm Flat end mill
|
T5 P0 X0 Y0 Z0 A0 B0 C0 U0 V0 W0 D1.00000 I0 J0 Q0 ;1mm Flat end mill
|
||||||
T6 P0 D+0.800000 ;drill 0.7
|
T6 P0 X0 Y0 Z0 A0 B0 C0 U0 V0 W0 D0.80000 I0 J0 Q0 ;drill 0.7
|
||||||
|
|||||||
Reference in New Issue
Block a user