1. Was ist GladeVCP?
GladeVCP ist eine LinuxCNC-Komponente, welche die Fähigkeit, eine neue Schaltfläche (engl. panel) auf LinuxCNC Benutzeroberflächen hinzuzufügen wie:
-
ACHSE
-
Touchy
-
Gscreen
-
GMOCCAPY
Im Gegensatz zu PyVCP ist GladeVCP nicht auf die Anzeige und Einstellung von HAL-Pins beschränkt, da beliebige Aktionen in Python-Code ausgeführt werden können - tatsächlich könnte eine komplette LinuxCNC-Benutzeroberfläche mit GladeVCP und Python erstellt werden.
GladeVCP uses the Glade WYSIWYG user interface editor, which makes it easy to create visually pleasing panels. It relies on the PyGObject bindings to the rich GTK3 widget set, and in fact all of these widgets may be used in a GladeVCP application - not just the specialized widgets for interacting with HAL and LinuxCNC, which are documented here.
1.1. PyVCP im Vergleich zu GladeVCP auf einen Blick
Beide unterstützen die Erstellung von Panels mit "HAL Widgets" - Benutzeroberfläche Elemente wie LED’s, Tasten, Schieberegler usw., deren Werte zu einem HAL-Pin, die wiederum Schnittstellen zu den Rest von LinuxCNC verbunden sind.
PyVCP:
-
Widget-Set: verwendet TkInter-Widgets.
-
Erstellung der Benutzeroberfläche: Zyklus "XML-Datei bearbeiten / Ergebnis ausführen / Aussehen auswerten".
-
Keine Unterstützung für die Einbettung benutzerdefinierter Ereignisbehandlung.
-
Keine LinuxCNC Interaktion über HAL Pin I/O hinaus unterstützt.
GladeVCP:
-
Widget set: relies on the GTK3 widget set.
-
User interface creation: uses the Glade WYSIWYG user interface editor.
-
Jede HAL-Pin-Änderung kann für einen Callback und damit einen benutzerdefinierten Python-Ereignishandler genutzt werden.
-
Jedes GTK-Signal (Tastendruck, Fenster-, E/A-, Timer-, Netzwerkereignisse) kann mit benutzerdefinierten Handlern in Python verknüpft werden.
-
Direkte LinuxCNC-Interaktion: beliebige Befehlsausführung, wie das Auslösen von MDI-Befehlen, um ein G-Code-Unterprogramm aufzurufen, sowie Unterstützung für Statuswechseloperationen durch Action Widgets.
-
Mehrere unabhängige GladeVCP-Panels können in verschiedenen Registerkarten ausgeführt werden.
-
Trennung von Aussehen und Funktionalität der Benutzeroberfläche: Änderung des Aussehens ohne Eingriff in den Code.
2. Ein kurzer Rundgang mit dem Beispielpanel
Die GladeVCP-Panel-Fenster können in drei verschiedenen Konfigurationen betrieben werden:
-
immer sichtbar, integriert in AXIS auf der rechten Seite, genau wie PyVCP-Panels,
-
als Registerkarte in AXIS, Touchy, Gscreen oder GMOCCAPY; in AXIS würde dies eine dritte Registerkarte neben den Registerkarten Vorschau und DRO erzeugen, die explizit angehoben werden müssen,
-
als eigenständiges Toplevel-Fenster, das unabhängig vom Hauptfenster ikonifiziert/deikonifiziert werden kann.
Wenn Sie eine installierte Version von LinuxCNC verwenden, sind die unten gezeigten Beispiele in der configuration picker in der Sample Configurations > apps > GladeVCP Zweig.
The following instructions only apply if you’re using a git checkout. Open a terminal and change to the directory created by git then issue the commands as shown.
Anmerkung
|
Damit die folgenden Befehle bei Ihrem Git-Checkout funktionieren, müssen Sie zuerst make ausführen, dann sudo make setuid und dann . ./scripts/rip-environment. Weitere Informationen über einen Git-Checkout finden Sie auf der LinuxCNC-Wiki-Seite. |
Führen Sie das in AXIS integrierte GladeVCP-Beispielpanel wie PyVCP wie folgt aus:
$ cd configs/sim/axis/gladevcp
$ linuxcnc gladevcp_panel.ini
Führen Sie das gleiche Panel aus, aber als Registerkarte innerhalb von AXIS:
$ cd configs/sim/axis/gladevcp
$ linuxcnc gladevcp_tab.ini
Um dieses Panel innerhalb von Touchy auszuführen:
$ cd configs/sim/touchy/gladevcp
$ linuxcnc gladevcp_touchy.ini
Functionally these setups are identical - they only differ in screen real estate requirements and visibility. Since it is possible to run several GladeVCP components in parallel (with different HAL component names), mixed setups are possible as well - for instance a panel on the right hand side, and one or more tabs for less-frequently used parts of the interface.
2.1. Erkunden des Beispielpanels
While running configs/sim/axis/gladevcp_panel.ini or configs/sim/axis/gladevcp_tab.ini, explore Show HAL Configuration - you will find the gladevcp
HAL component and may observe their pin values while interacting with the widgets in the panel. The HAL setup can be found in configs/axis/gladevcp/manual-example.hal.
The example panel has two frames at the bottom. The panel is configured so that resetting ESTOP activates the Settings frame and turning the machine on enables the Commands frame at the bottom. The HAL widgets in the Settings frame are linked to LEDs and labels in the Status frame, and to the current and prepared tool number - play with them to see the effect. Executing the T<toolnumber> and M6 commands in the MDI window will change the current and prepared tool number fields.
The buttons in the Commands frame are MDI Action widgets - pressing them will execute an MDI command in the interpreter. The third button Execute Oword subroutine is an advanced example - it takes several HAL pin values from the Settings frame, and passes them as parameters to the Oword subroutine. The actual parameters received by the routine are displayed by (DEBUG, ) commands - see ../../nc_files/oword.ngc for the subroutine body.
Um zu sehen, wie das Panel in AXIS integriert ist, sehen Sie die Anweisung [DISPLAY]GLADEVCP in configs/sim/axis/gladevcp/gladevcp_panel.ini, die Anweisung [DISPLAY]EMBED* in configs/sim/axis/gladevcp/gladevcp_tab.ini und [HAL]POSTGUI_HALFILE sowohl in configs/sim/axis/gladevcp/gladevcp_tab.ini als auch in configs/sim/axis/gladevcp/gladevcp_panel.ini.
2.2. Erkunden der Beschreibung der Benutzeroberfläche
The user interface is created with the Glade UI editor - to explore it, you need to have Glade installed. To edit the user interface, run the command
$ glade configs/axis/gladevcp/manual-example.ui
Das erforderliche glade-Programm kann auf neueren Systemen den Namen glade-gtk2 tragen.
The center window shows the appearance of the UI. All user interface objects and support objects are found in the right top window, where you can select a specific widget (or by clicking on it in the center window). The properties of the selected widget are displayed, and can be changed, in the right bottom window.
Um zu sehen, wie MDI-Befehle von den MDI-Aktions-Widgets weitergegeben werden, erkunden Sie die Widgets, die unter "Aktionen" im Fenster oben rechts aufgeführt sind, und im Fenster unten rechts unter der Registerkarte "Allgemein" die Eigenschaft "MDI-Befehl".
2.3. Erkunden der Python Callback Funktionen
Sehen Sie, wie ein Python-Callback in das Beispiel integriert wird:
-
In Glade siehe das
hits
Label Widget (ein einfaches GTK+ Widget). -
Im Widget
button1
auf der Registerkarte "Signale" das Signal "gedrückt" suchen, das mit dem Handler "on_button_press" verknüpft ist. -
In hitcounter.py sehen Sie sich die Methode on_button_press an und sehen, wie sie die Eigenschaft label im Objekt hits setzt.
Dies ist nur ein kurzer Überblick über das Konzept - der Callback-Mechanismus wird im Abschnitt GladeVCP Programming ausführlicher behandelt.
3. Erstellen und Integrieren einer Glade-Benutzeroberfläche
3.1. Voraussetzung ist: Glade-Installation
To view or modify Glade UI files, you need Glade 3.38.2 or later installed - it is not needed just to run a GladeVCP panel. If the glade command is missing, install it with the command:
$ sudo apt install glade
Überprüfen Sie dann die installierte Version, die gleich oder höher als 3.6.7 sein muss:
$ glade --version
Glade enthält einen internen Python-Interpreter, und es wird nur Python3 unterstützt. Dies gilt für Debian Bullseye, Ubuntu 21 und Mint 21 oder später. Ältere Versionen werden nicht funktionieren, Sie werden einen Python-Fehler erhalten.
3.2. Glade ausführen, um eine neue Benutzeroberfläche zu erstellen
This section just outlines the initial LinuxCNC-specific steps. For more information and a tutorial on Glade, see http://glade.gnome.org. Some Glade tips & tricks may also be found on youtube.
Ändern Sie entweder eine bestehende UI-Komponente, indem Sie glade <Datei>.ui
ausführen, oder starten Sie eine neue, indem Sie einfach den Befehl glade
in der Shell ausführen.
-
If LinuxCNC was not installed from a package, the LinuxCNC shell environment needs to be set up with
source <linuxcncdir>/scripts/rip-environment
, otherwise Glade won’t find the LinuxCNC-specific widgets. -
Wenn Sie nach nicht gespeicherten Einstellungen gefragt werden, akzeptieren Sie einfach die Standardeinstellungen und klicken Sie auf „Schließen“.
-
From Toplevels (toolbar), pick GtkWindow (first entry) as top level window. Set window1 as ID in the right pane under the tab General. This naming is important because GladeVCP relies on it.
-
From the button with the three dots you can find the LinuxCNC specific widgets.
-
Add a container like a HAL_Box or a HAL_Table from HAL Python to the frame.
-
Pick and place some elements like LED, button, etc. within a container.
This will look like this:
Glade tends to write a lot of messages to the shell window, which mostly can be ignored. Select File→Save as, give it a name like myui.ui and make sure it is saved as GtkBuilder file (radio button left bottom corner in Save dialog). GladeVCP will also process the older libglade format correctly but there is no point in using it. The convention for GtkBuilder file extension is .ui.
3.3. Testen eines Panels
Sie sind jetzt bereit, es auszuprobieren (während LinuxCNC, z. B. AXIS läuft) mit:
gladevcp myui.ui
GladeVCP creates a HAL component named like the basename of the UI file - myui in this case - unless overridden by the -c <component name>
option. If running AXIS, just try Show HAL configuration and inspect its pins.
You might wonder why widgets contained a HAL_Hbox or HAL_Table appear greyed out (inactive). HAL containers have an associated HAL pin which is off by default, which causes all contained widgets to render inactive. A common use case would be to associate these container HAL pins with halui.machine.is-on
or one of the halui.mode
signals, to assure some widgets appear active only in a certain state.
To just activate a container, execute the HAL command setp gladevcp.<container-name> 1
.
3.4. Vorbereiten der HAL-Befehlsdatei
The suggested way of linking HAL pins in a GladeVCP panel is to collect them in a separate file with extension .hal. This file is passed via the POSTGUI_HALFILE=
option in the HAL
section of your INI file.
Achtung
|
Fügen Sie die GladeVCP-HAL-Befehlsdatei nicht in den Abschnitt AXIS [HAL]HALFILE= ini ein, da dies nicht den gewünschten Effekt hat - siehe die folgenden Abschnitte. |
3.5. Einbindung in AXIS, wie PyVCP
Platzieren Sie das GladeVCP-Panel im rechten Seitenbereich, indem Sie in der INI-Datei Folgendes angeben:
[DISPLAY] # add GladeVCP panel where PyVCP used to live: GLADEVCP= -u ./hitcounter.py ./manual-example.ui [HAL] # HAL-Befehle für GladeVCP-Komponenten in einer Registerkarte müssen über POSTGUI_HALFILE ausgeführt werden POSTGUI_HALFILE = ./handbuch-beispiel.hal [RS274NGC] # gladevcp Demo-spezifische Oword-Subs leben hier SUBROUTINE_PATH = ../../nc_files/gladevcp_lib
The default HAL component name of a GladeVCP application started with the GLADEVCP option is: gladevcp
.
Die von AXIS in der obigen Konfiguration tatsächlich ausgeführte Befehlszeile lautet wie folgt:
halcmd loadusr -Wn gladevcp gladevcp -c gladevcp -x {XID} -u ./hitcounter.py ./manual-example.ui
You may add arbitrary gladevcp
options here, as long as they dont collide with the above command line options.
Es ist möglich, einen benutzerdefinierten HAL-Komponentennamen zu erstellen, indem Sie die Option -c
hinzufügen:
[DISPLAY] # fügen Sie das GladeVCP-Panel an der Stelle ein, an der früher PyVCP stand: GLADEVCP= -c example -u ./hitcounter.py ./manual-example.ui
Die Befehlszeile, die von AXIS für die obigen Schritte ausgeführt wird, lautet:
halcmd loadusr -Wn example gladevcp -c example -x {XID} -u ./hitcounter.py ./manual-example.ui
Anmerkung
|
The file specifiers like ./hitcounter.py, ./manual-example.ui, etc. indicate that the files are located in the same directory as the INI file. You might have to copy them to you directory (alternatively, specify a correct absolute or relative path to the file(s)). |
Anmerkung
|
The [RS274NGC]SUBROUTINE_PATH= option is only set so the example panel will find the Oword subroutine (oword.ngc) for the MDI Command widget. It might not be needed in your setup. The relative path specifier ../../nc_files/gladevcp_lib is constructed to work with directories copied by the configuration picker and when using a run-in-place setup. |
3.6. Einbetten als Registerkarte (engl. tab)
Bearbeiten Sie dazu Ihre INI-Datei und fügen Sie die Abschnitte DISPLAY und HAL der INI-Datei wie folgt hinzu:
[DISPLAY] # GladeVCP-Panel als Registerkarte neben Vorschau/DRO hinzufügen: EMBED_TAB_NAME=GladeVCP demo EMBED_TAB_COMMAND=halcmd loadusr -Wn gladevcp gladevcp -c gladevcp -x {XID} -u ./gladevcp/hitcounter.py ./gladevcp/manual-example.ui [HAL] # HAL-Befehle für GladeVCP-Komponenten in einer Registerkarte müssen über POSTGUI_HALFILE ausgeführt werden POSTGUI_HALFILE = ./gladevcp/manual-example.hal [RS274NGC] # gladevcp Demo-spezifische Oword-Subs leben hier SUBROUTINE_PATH = ../../nc_files/gladevcp_lib
Note the halcmd loadusr
way of starting the tab command - this assures that POSTGUI_HALFILE will only be run after the HAL component is ready. In rare cases you might run a command here which uses a tab but does not have an associated HAL component. Such a command can be started without halcmd loadusr, and this signifies to AXIS that it does not have to wait for a HAL component since there is none.
When changing the component name in the above example, note that the names used in -Wn <component>
and -c <component>
must be identical.
Try it out by running AXIS - there should be a new tab called GladeVCP demo near the DRO tab. Select that tab, you should see the example panel nicely fit within AXIS.
Anmerkung
|
Make sure the UI file is the last option passed to GladeVCP in both the GLADEVCP= and EMBED_TAB_COMMAND= statements. |
3.7. Integration in Touchy
Um eine GladeVCP-Registerkarte zu "Touchy" hinzuzufügen, bearbeiten Sie Ihre INI-Datei wie folgt:
[DISPLAY] # GladeVCP-Panel als Registerkarte hinzufügen EMBED_TAB_NAME=GladeVCP-Demo EMBED_TAB_COMMAND=gladevcp -c gladevcp -x {XID} -u ./hitcounter.py -H ./gladevcp-touchy.hal ./manual-example.ui [RS274NGC] # gladevcp Demo-spezifische Oword-Subs leben hier SUBROUTINE_PATH = ../../nc_files/gladevcp_lib
Anmerkung
|
The file specifiers like ./hitcounter.py, ./manual-example.ui, etc. indicate that the files are located in the same directory as the INI file. You might have to copy them to you directory (alternatively, specify a correct absolute or relative path to the file(s)). |
Beachten Sie die folgenden Unterschiede zur Einrichtung der Registerkarte von AXIS:
-
Die HAL-Befehlsdatei ist leicht modifiziert, da Touchy die halui-Komponenten nicht verwendet, so dass seine Signale nicht verfügbar sind und einige Verknüpfungen verwendet wurden.
-
There is no POSTGUI_HALFILE= INI option, but passing the HAL command file on the EMBED_TAB_COMMAND= line is ok.
-
The halcmd loaduser -Wn … incantation is not needed.
4. GladeVCP-Befehlszeilenoptionen
See also man gladevcp
. These are the GladeVCP command line options:
Usage: gladevcp [options] myfile.ui
Optionen:
-h, --help::
Show this help message and exit.
-c NAME::
Setzt den Komponentennamen auf NAME. Standard ist der Basisname der UI-Datei.
-d::
Debug-Ausgabe einschalten
-g GEOMETRY::
Set geometry WIDTHxHEIGHT+XOFFSET+YOFFSET. Values are in pixel units, XOFFSET/YOFFSET is referenced from top left of screen.
Use -g WIDTHxHEIGHT for just setting size or -g +XOFFSET+YOFFSET for just position
-H FILE::
Execute HAL statements from FILE with halcmd after the component is set up and ready
-m MAXIMUM::
Force panel window to maximize.
Together with the -g geometry option one can move the panel to a second monitor and force it to use all of the screen
-t THEME::
Set gtk theme. Default is system theme. Different panels can have different themes.
-x XID::
Re-parent GladeVCP into an existing window XID instead of creating a new top level window
-u FILE::
Dateien als zusätzliche benutzerdefinierte Module mit Handlern verwenden
-U USEROPT::
übergibt USEROPTs an Python-Module
5. Den GladeVCP-Startvorgang verstehen
The integration steps outlined above look a bit tricky, and they are. It does therefore help to understand the startup process of LinuxCNC and how this relates to GladeVCP.
Der normale Startvorgang von LinuxCNC macht folgendes:
-
Die Echtzeitumgebung wird gestartet.
-
Alle HAL-Komponenten werden geladen.
-
Die HAL-Komponenten sind durch die .hal cmd-Skripte miteinander verbunden.
-
task
,iocontrol
und schließlich wird die Benutzeroberfläche gestartet. -
Vor der Einführung von GladeVCP wurde davon ausgegangen, dass zu dem Zeitpunkt, zu dem die Benutzeroberfläche gestartet wird, die gesamte HAL geladen, verkabelt und einsatzbereit ist.
Die Einführung von GladeVCP brachte das folgende Problem mit sich:
-
GladeVCP-Panels müssen in ein übergeordnetes GUI-Fenster eingebettet werden.
-
GladeVCP panels need to be embedded in a master GUI window setup, e.g., AXIS, or Touchy, Gscreen, or GMOCCAPY (embedded window or as an embedded tab).
-
Dies erfordert, dass die Master-GUI läuft, bevor das GladeVCP-Fenster in die Master-GUI eingehängt werden kann.
-
GladeVCP ist jedoch auch eine HAL-Komponente und erzeugt eigene HAL-Pins.
-
Als Folge davon müssen alle HAL-Pins, die GladeVCP HAL-Pins als Quelle oder Ziel verwenden, nach der Einrichtung der GUI ausgeführt werden.
This is the purpose of the POSTGUI_HALFILE
. This INI option is inspected by the GUIs. If a GUI detects this option, it runs the corresponding HAL file after any embedded GladeVCP panel is set up. However, it does not check whether a GladeVCP panel is actually used, in which case the HAL cmd file is just run normally. So if you do NOT start GladeVCP through GLADEVCP
or EMBED_TAB
etc, but later in a separate shell window or some other mechanism, a HAL command file in POSTGUI_HALFILE
will be executed too early. Assuming GladeVCP pins are referenced herein, this will fail with an error message indicating that the GladeVCP HAL component is not available.
Falls Sie also GladeVCP von einem separaten Shell-Fenster aus starten (d.h. nicht von der GUI eingebettet gestartet):
-
Sie können sich nicht darauf verlassen, dass die INI-Option "POSTGUI_HALFILE" dazu führt, dass die HAL-Befehle "zum richtigen Zeitpunkt" ausgeführt werden, also kommentieren Sie sie in der INI-Datei aus.
-
Explicitly pass the HAL command file which refers to GladeVCP pins to GladeVCP with the
-H <halcmd file>
option (see previous section).
6. HAL Widget-Referenz
GladeVCP includes a collection of Gtk widgets with attached HAL pins called HAL Widgets, intended to control, display or otherwise interact with the LinuxCNC HAL layer. They are intended to be used with the Glade user interface editor. With proper installation, the HAL Widgets should show up in Glade’s HAL Python widget group. Many HAL specific fields in the Glade General section have an associated mouse-over tool tip.
HAL signals come in two variants, bits and numbers. Bits are off/on signals. Numbers can be "float", "s32" or "u32". For more information on HAL data types see the HAL manual. The GladeVCP widgets can either display the value of the signal with an indicator widget, or modify the signal value with a control widget. Thus there are four classes of GladeVCP widgets that you can connect to a HAL signal. Another class of helper widgets allow you to organize and label your panel.
-
Widgets zur Anzeige von "Bit"-Signalen: HAL_LED
-
Widgets zur Steuerung von „Bit“-Signalen: HAL_Button HAL_RadioButton HAL_CheckButton
-
Widgets zur Anzeige von "Zahlen"-Signalen: HAL_Label, HAL_ProgressBar, HAL_HBar und HAL_VBar, HAL_Meter
-
Widgets zur Steuerung von "Zahlen"-Signalen: HAL_SpinButton, HAL_HScale and HAL_VScale, Jog Wheel, Geschwindigkeitsregelung
-
Empfindliche Kontroll-Widgets: State_Sensitive_Table HAL_Table and HAL_HBox
-
Vorschau des Werkzeugpfads: HAL_Gremlin
-
Widgets zur Anzeige der Achsenpositionen: DRO Widget, Combi DRO Widget
-
Widgets für die Dateiverarbeitung: IconView Datei Auswahl
-
Widgets for display/edit of all axes offsets: OffsetPage
-
Widgets for display/edit of all tool offsets: Tooloffset editor
-
Widget for G-code display and edit: HAL_Sourceview
-
Widget for MDI input and history display: MDI History
6.1. Benennung von Widgets und HAL-Pins
Die meisten HAL-Widgets haben einen einzigen zugehörigen HAL-Pin mit demselben HAL-Namen wie das Widget (glade: General→Name).
Ausnahmen von dieser Regel sind derzeit:
-
HAL_Spinbutton' und HAL_ComboBox, die zwei Pins haben: einen
<widgetname>-f
(float) und einen<widgetname>-s
(s32) Pin -
HAL_ProgressBar', die einen
<widgetname>-value
-Eingangspin und einen<widgetname>-scale
-Eingangspin hat.
6.2. Python-Attribute und Methoden von HAL Widgets
HAL widgets are instances of GtKWidgets and hence inherit the methods, properties and signals of the applicable GtkWidget class. For instance, to figure out which GtkWidget-related methods, properties and signals a HAL_Button has, lookup the description of GtkButton in the PyGObject API Reference.
An easy way to find out the inheritance relationship of a given HAL widget is as follows: Run glade, place the widget in a window, and select it; then choose the Signals tab in the Properties window. For example, selecting a HAL_LED widget, this will show that a HAL_LED is derived from a GtkWidget, which in turn is derived from a GtkObject, and eventually a GObject.
Full class hierarchy can be seen by invoking the GtkInspector while in the Glade GUI by selecting a widget then pressing Control-Shift-I. If the Inspector doesn’t open then it can be enabled from a terminal by entering:
gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true
The Inspector is also handy for testing css style changes "on the fly" as well as determining all the properties and signals available for a widget.
HAL-Widgets haben auch einige HAL-spezifische Python-Attribute:
- hal_pin
-
The underlying HAL pin Python object in case the widget has a single pin type
- hal_pin_s, hal_pin_f
-
The s32 and float pins of the HAL_Spinbutton and HAL_ComboBox widgets - note these widgets do not have a hal_pin attribute!
- hal_pin_scale
-
The float input pin of HAL_ProgressBar widget representing the maximum absolute value of input.
Es gibt mehrere HAL-spezifische Methoden von HAL Widgets, aber die einzige relevante Methode ist:
- <halpin>.get()
-
Abrufen des Wertes des aktuellen HAL-Pins, wobei <halpin> der oben aufgeführte zutreffende HAL-Pinname ist.
6.3. Einstellung von Pin- und Widget-Werten
As a general rule, if you need to set a HAL output widget’s value from Python code, do so by calling the underlying Gtk setter (e.g., set_active()
, set_value()
). Do not try to set the associated pin’s value by halcomp[pinname] = value
directly because the widget will not take notice of the change!
It might be tempting to set HAL widget input pins programmatically. Note this defeats the purpose of an input pin in the first place - it should be linked to, and react to signals generated by other HAL components. While there is currently no write protection on writing to input pins in HAL Python, this doesn’t make sense. You might use setp _pinname_ _value_
in the associated HAL file for testing though.
Es ist völlig in Ordnung, den Wert eines Ausgangs-HAL-Pins mit halcomp[pinname] = value
zu setzen, vorausgesetzt, dieser HAL-Pin ist nicht mit einem Widget verbunden, d.h. er wurde mit der Methode hal_glib.GPin(halcomp.newpin(<name>,<type>,<direction>))
erstellt (siehe GladeVCP Programming für ein Beispiel).
6.4. Das hal-pin-changed-Signal
Event-driven programming means that the UI tells your code when "something happens" - through a callback, like when a button was pressed. The output HAL widgets (those which display a HAL pin’s value) like LED, Bar, VBar, Meter, etc., support the hal-pin-changed
signal, which may cause a callback into your Python code when - well, a HAL pin changes its value. This means there’s no more need for permanent polling of HAL pin changes in your code, the widgets do that in the background and let you know.
Here is an example how to set a hal-pin-changed
signal for a HAL_LED in the Glade UI editor:
Das Beispiel in configs/apps/gladevcp/complex
zeigt, wie dies in Python gehandhabt wird.
6.5. Buttons
This group of widgets are derived from various Gtk buttons and consists of HAL_Button, HAL_ToggleButton, HAL_RadioButton and CheckButton widgets. All of them have a single output BIT pin named identical to the widget. Buttons have no additional properties compared to their base Gtk classes.
-
HAL_Button: instantaneous action, does not retain state. Important signal:
pressed
-
HAL_ToggleButton, HAL_CheckButton: retains on/off state. Important signal:
toggled
-
HAL_RadioButton: a one-of-many group. Important signal:
toggled
(per button). -
Important common methods:
set_active()
,get_active()
-
Important properties:
label
,image
Tipp
|
Definieren von Optionsschaltflächengruppen in Glade:
|
Siehe configs/apps/gladevcp/by-widget/
für eine GladeVCP-Anwendung und UI-Datei für die Arbeit mit Optionsfeldern.
6.6. Skalen (engl. scales)
HAL_HScale und HAL_VScale sind von GtkHScale bzw. GtkVScale abgeleitet.
- <widgetname>
-
out FLOAT pin
- <widgetname>-s
-
out s32 pin
To make a scale useful in Glade, add an Adjustment (General → Adjustment → New or existing adjustment) and edit the adjustment object. It defines the default/min/max/increment values. Also, set adjustment Page size and Page increment to zero to avoid warnings.
6.7. SpinButton
HAL SpinButton ist von GtkSpinButton abgeleitet und besitzt zwei Pins:
- <widgetname>-f
-
out FLOAT pin
- <widgetname>-s
-
out s32 pin
Um nützlich zu sein, benötigen SpinButtons einen Einstellwert wie Skalen, siehe oben.
6.8. Hal_Dial
Das hal_dial Widget simuliert ein Jogwheel oder ein Einstellrad.
Es kann mit der Maus bedient werden. Sie können einfach das Mausrad benutzen, während sich der Mauszeiger über dem Hal_Dial-Widget befindet, oder Sie halten die linke Maustaste gedrückt und bewegen den Mauszeiger in kreisförmiger Richtung, um die Zählungen zu erhöhen oder zu verringern.
Mit einem Doppelklick auf die linke oder rechte Taste kann der Skalierungsfaktor erhöht oder verringert werden.
-
Gegen den Uhrzeigersinn = kleinere Zählwerte
-
Clockwise = increase counts
-
Wheel up = increase counts
-
Wheel down = reduce counts
-
left Double Click = x10 scale
-
Right Double Click = /10 scale
6.8.1. Pins
hal_dial
exports its count value as HAL pins:
- <widgetname>
-
out s32 pin
- <widgetname>-scaled
-
out FLOAT pin
- <widgetname>-delta-scaled
-
out FLOAT pin
6.8.2. Eigenschaften
hal_dial
hat die folgenden Eigenschaften:
- cpr
-
Legt die Anzahl der Zählungen pro Umdrehung fest, zulässige Werte liegen im Bereich von 25 bis 360 +
Voreinstellung = 100 - show_counts
-
Setzen Sie diesen Wert auf False, wenn Sie die Anzeige der Zählerstände in der Mitte des Widgets ausblenden möchten. +
Standard = True - label
-
Legen Sie den Inhalt der Beschriftung fest, die über dem Zählwert angezeigt werden kann.
Ist die angegebene Beschriftung länger als 15 Zeichen, wird sie auf 15 Zeichen gekürzt.
Standard = leer - center_color
-
Damit kann man die Farbe des Rades ändern. Sie verwendet einen GDK-Farbstring. +
Standard = #bdefbdefbdef (grau) - count_type_shown
-
Es sind drei Zählungen verfügbar 0) Rohe CPR-Zählungen 1) Skalierte Zählungen 2) Delta-skalierte Zählungen. +
Standard = 1-
Die Zählung basiert auf der gewählten CPR - sie zählt positiv und negativ. Er ist als s32-Pin verfügbar.
-
Der skalierte Zähler ist die CPR-Zahl mal der Skala - er kann positiv und negativ sein.
Wenn Sie die Skala ändern, spiegelt der Ausgang die Änderung sofort wider. Er ist als FLOAT-Pin verfügbar. -
Delta-scaled-count ist cpr count CHANGE, mal scale. +
Wenn Sie die Skala ändern, werden nur die Zählerstände nach dieser Änderung skaliert und dann zum aktuellen Wert addiert. +
Er ist als FLOAT-Pin verfügbar.
-
- scale_adjustable
-
Setzen Sie diesen Wert auf False, wenn Sie Änderungen der Skalierung durch Doppelklick auf das Widget nicht zulassen wollen. +
Wenn dieser Wert auf False gesetzt ist, wird der Skalierungsfaktor im Widget nicht angezeigt. +
Standard = True - scale
-
Legen Sie diesen Wert fest, um die Zählungen zu skalieren. +
Standard = 1.0
6.8.3. Direkte Programmsteuerung
Es gibt Möglichkeiten, das Widget direkt mit Python zu steuern.
Verwenden Sie goobject, um die oben aufgeführten Eigenschaften einzustellen:
[widget name].set_property("cpr",int(value))
[widget name].set_property("show_counts, True)
[widget name].set_property("center_color",gtk.gdk.Color('#bdefbdefbdef'))
[widget name].set_property('label', 'Test Dial 12345')
[widget name].set_property('scale_adjustable', True)
[widget name].set_property('scale', 10.5)
[widget name].set_property('count_type_shown', 0)
Es gibt Python-Methoden:
-
[Widgetname].get_value()
Gibt den Zählwert als s32-Ganzzahl zurück -
[Widgetname].get_scaled_value()`
Gibt den Zählwert als Gleitkommazahl zurück -
[Widget-Name].get_delta_scaled_value() +
Gibt den Counts-Wert als Gleitkommawert zurück -
[Widgetname].set_label("string")
+
Setzt den Inhalt des Labels mit "string"
Es werden zwei GObject-Signale ausgegeben:
-
count_changed
+
Wird ausgesendet, wenn sich die Anzahl des Widgets ändert, z.B. wenn es mit dem Rad gescrollt wird. -
scale_changed
Wird ausgegeben, wenn sich der Maßstab des Widgets ändert, z. B. durch Doppelklick.
Schließen Sie diese wie folgt an:
[widget name].connect('count_changed', [count function name])
[widget name].connect('scale_changed', [scale function name])
Die Callback-Funktionen würden dieses Muster verwenden:
def [Name der Zählfunktion](widget, count,scale,delta_scale):
Dies gibt zurück: das Widget, die aktuelle Anzahl, Skalierung und Delta-Skalierung dieses Widgets.
6.9. Jog-Handrad (engl. jog wheel)
The jogwheel
widget simulates a real jogwheel. It can be operated with the mouse. You can just use the mouse wheel, while the mouse cursor is over the JogWheel widget, or you push the left mouse button and move the cursor in circular direction to increase or degrease the counts.
-
Gegen den Uhrzeigersinn = kleinere Zählwerte
-
Clockwise = increase counts
-
Wheel up = increase counts
-
Wheel down = reduce counts
Da das Bewegen der Maus per Drag & Drop schneller sein kann, als das Widget sich selbst zu aktualisieren vermag, kann, dass Sie Zähler verlieren, wenn Sie zu schnell drehen. Es wird empfohlen, das Mausrad zu verwenden, und nur für sehr grobe Bewegungen die Drag-and-Drop-Methode.
6.9.1. Pins
jogwheel
exports its count value as HAL pin:
- <widgetname>-s
-
out s32 pin
6.9.2. Eigenschaften
jogwheel
hat folgende Eigenschaften:
- Größe
-
Legt die Größe des Widgets in Pixeln fest; die zulässigen Werte liegen im Bereich von 100 bis 500 Standard = 200
- cpr
-
Legt die Anzahl der Zählungen pro Umdrehung fest, zulässige Werte liegen im Bereich von 25 bis 100 Standard = 40
- show_counts
-
Setzen Sie diesen Wert auf False, wenn Sie die Anzeige der Zählerstände in der Mitte des Widgets ausblenden möchten.
- label
-
Set the content of the label which may be shown over the counts value. The purpose is to give the user an idea about the usage of that jogwheel. If the label given is longer than 12 Characters, it will be cut to 12 Characters.
6.9.3. Direkte Programmsteuerung
Es gibt mehrere Möglichkeiten, das Widget direkt mit Python zu steuern.
Verwenden Sie GObject, um die oben aufgeführten Eigenschaften einzustellen:
[widget name].set_property("size",int(value))
[widget name].set_property("cpr",int(value))
[widget name].set_property("show_counts, True)
There are two Python methods:
-
[widget name].get_value()
Gibt den Zählwert als Ganzzahl zurück -
[Widgetname].set_label("string")
+
Setzt den Inhalt des Labels mit "string"
6.10. Geschwindigkeitsregelung
speedcontrol
is a widget specially made to control an adjustment with a touch screen. It is a replacement to the normal scale widget which is difficult to slide on a touch screen.
The value is controlled with two button to increase or decrease the value. The increment will change as long a button is pressed. The value of each increment as well as the time between two changes can be set using the widget properties.
6.10.1. Pins
speedcontrol bietet einige HAL-Pins:
- <widgetname>-value
-
out float pin +
Der angezeigte Wert des Widgets. - <widgetname>-scaled-value
-
out float pin +
Der angezeigte Wert geteilt durch den Skalenwert, ist dies sehr nützlich, wenn die Geschwindigkeit in Einheiten / min angezeigt wird, aber LinuxCNC erwartet, dass es in Einheiten / Sekunde sind. - <widgetname>-scale
-
in float pin +
Die anzuwendende Skalierung. +
Voreingestellt ist 60. - <widgetname>-increase
-
in Bit-Pin +
Solange der Pin wahr ist, erhöht sich der Wert. +
Sehr praktisch bei angeschlossenem Taster. - <widgetname>-decrease
-
in Bit-Pin
Solange der Pin wahr ist, wird der Wert verringert.
Sehr praktisch bei angeschlossenem Taster.
6.10.2. Eigenschaften
speedcontrol hat die folgenden Eigenschaften:
- height (engl. für Höhe)
-
Integer +
Die Höhe des Widgets in Pixel. +
Erlaubte Werte sind 24 bis 96. +
Voreinstellung ist 36. - Wert
-
Gleitkommazahl +
Der einzustellende Startwert. +
Erlaubte Werte liegen im Bereich von 0,001 bis 99999,0. +
Standardwert ist 10,0. - min
-
Gleitkommazahl +
Der zulässige Mindestwert. +
Erlaubte Werte sind 0,0 bis 99999,0. +
Der Standardwert ist 0,0. +
Wenn Sie diesen Wert ändern, wird die Schrittweite auf den Standardwert zurückgesetzt, so dass es notwendig sein kann, anschließend eine neue Schrittweite festzulegen. - max
-
Gleitkommazahl
Der maximal zulässige Wert.
Erlaubte Werte sind 0,001 bis 99999,0.
Der Standardwert ist 100,0.
Wenn Sie diesen Wert ändern, wird die Schrittweite auf den Standardwert zurückgesetzt, so dass es notwendig sein kann, anschließend eine neue Schrittweite festzulegen. - increment (engl. für Zunahme)
-
Gleitkomma +
Legt die angewandte Schrittweite pro Mausklick fest. +
Erlaubte Werte sind 0,001 bis 99999,0 und -1. +
Standardwert ist -1, was zu 100 Schritten von min bis max führt. - inc_speed
-
Ganzzahlig +
Legt die Zeitverzögerung für die Erhöhung der Geschwindigkeit fest, bei der die Tasten gedrückt gehalten werden. +
Erlaubte Werte sind 20 bis 300. +
Voreinstellung ist 100. - unit (engl. für Einheit)
-
Zeichenfolge
Legt die Einheit fest, die in der Leiste hinter dem Wert angezeigt wird.
Jede Zeichenkette ist erlaubt.
Standard ist "". - color (engl. für Farbe)
-
Farbe +
Legt die Farbe des Balkens fest. +
Jede Hex-Farbe ist erlaubt. +
Standard ist "#FF8116". - template (engl. für Vorlage)
-
Zeichenfolge +
Textvorlage zur Anzeige des Wertes. Es wird die Python-Formatierung verwendet. +
Jedes zulässige Format. +
Standard ist "%.1f". - do_hide_button
-
Boolescher Wert +
Ob die Schaltfläche zum Erhöhen und Verringern angezeigt oder ausgeblendet werden soll. +
True oder False. +
Voreinstellung = False.
6.10.3. Direkte Programmsteuerung
Es gibt mehrere Möglichkeiten, das Widget direkt mit Python zu steuern.
Verwenden Sie GObject, um die oben aufgeführten Eigenschaften einzustellen:
[widget name].set_property("do_hide_button",bool(value))
[widget name].set_property("color","#FF00FF")
[widget name].set_property("unit", "mm/min")
usw.
Es gibt auch Python-Methoden zur Änderung des Widgets:
[widget name].set_adjustment(gtk-adjustment)
You can assign a existing adjustment to the control, that way it is easy to replace existing sliders without many code changes. Be aware, that after changing the adjustment you may need to set a new increment, as it will be reset to its default (100 steps from MIN to MAX):
-
[Widgetname].get_value()
+
Gibt den Zählwert als Float zurück -
[Widgetname].set_value(float(Wert))
+
Setzt das Widget auf den befohlenen Wert -
[Widgetname].set_digits(int(Wert))
+
Setzt die Ziffern des zu verwendenden Wertes -
[Widgetname].hide_button(bool(Wert))
+
Die Schaltfläche ausblenden oder anzeigen
6.11. Label
hal_label
ist ein einfaches Widget, das auf GtkLabel basiert und einen HAL-Pin-Wert in einem benutzerdefinierten Format darstellt.
- label_pin_type
-
The pin’s HAL type (0:s32, 1:float, 2:u32), see also the tooltip on General→HAL pin type (note this is different from PyVCP which has three label widgets, one for each type).
- text_template
-
Bestimmt den angezeigten Text - eine Python-Formatzeichenfolge zur Umwandlung des Pin-Werts in Text. Der Standardwert ist
%s
(Werte werden mit der Funktion str() umgewandelt), kann aber als Argument für Pythons format()-Methode jede beliebige Zahl enthalten. +
Beispiel:Distance: %.03f
zeigt den Text und den Pin-Wert mit 3 Nachkommastellen, aufgefüllt mit Nullen für einen FLOAT-Pin.
6.12. Containers (engl. für Behälter)
-
HAL_HideTable
-
HAL_Table
-
State_Sensitive_Table
-
HAL_HBox (deprecated)
Diese Container sollen dazu dienen, ihre Kinder zu insensibilisieren (auszugrauen) oder zu verstecken. +
Nicht sensibilisierte Kinder reagieren nicht auf Eingaben.
- HAL_HideTable
-
Has one HAL BIT input pin which controls if its child widgets are hidden or not.
- Pin:
-
<Panel_basename>.<widgetname>
-
in Bit-Pin
Wenn der Pin niedrig ist, sind die untergeordneten Widgets sichtbar, was der Standardzustand ist.
- HAL_Table und HAL_Hbox
-
Have one HAL BIT input pin which controls if their child widgets are sensitive or not.
- Pin:
-
<Panel_basename>.<widgetname>
-
in Bit-Pin
Wenn der Pin niedrig ist, sind die untergeordneten Widgets inaktiv, was der Standardzustand ist.
- State_Sensitive_Table
-
Responds to the state to LinuxCNC’s interpreter.
Optionally selectable to respond to must-be-all-homed, must-be-on and must-be-idle.
You can combine them. It will always be insensitive at Estop.
(Has no pin).
Warnung
|
HAL_Hbox is deprecated - use HAL_Table. If current panels use it, it won’t fail. You just won’t find it in the GLADE editor anymore. Future versions of GladeVCP may remove this widget completely and then you will need to update the panel. |
Tipp
|
Wenn Sie feststellen, dass ein Teil Ihrer GladeVCP-Anwendung "ausgegraut" (unempfindlich) ist, prüfen Sie, ob ein HAL_Table-Pin nicht gesetzt oder nicht angeschlossen ist. |
6.13. LED
The hal_led
simulates a real indicator LED.
It has a single input BIT pin which controls its state: ON or OFF.
6.13.1. Eigenschaften
LEDs haben verschiedene Eigenschaften, die ihr Aussehen und ihre Wirkung bestimmen:
- on_color
-
String, der die ON-Farbe der LED definiert. +
Kann jeder gültige gdk.Color-Name sein. +
Funktioniert nicht unter Ubuntu 8.04. - off_color
-
String, der die OFF-Farbe der LED definiert. +
Kann jeder gültige gdk.Color-Name oder der spezielle Wertdark
sein.dark
bedeutet, dass die OFF-Farbe auf den Wert 0,4 der ON-Farbe gesetzt wird.
Funktioniert nicht unter Ubuntu 8.04. - pick_color_on, pick_color_off
-
Farben für den EIN- und AUS-Zustand.
Diese können als "#RRRRGGGGBBBB"-Strings dargestellt werden und sind optionale Eigenschaften, die Vorrang vor "on_color" und "off_color" haben. - led_size
-
LED-Radius (für Quadrat - halbe LED-Seite)
- led_shape
-
LED-Form. +
Gültige Werte sind 0 für runde, 1 für ovale und 2 für quadratische Formen. - led_blink_rate
-
If set and LED is ON then it is blinking.
Blink period is equal to "led_blink_rate" specified in milliseconds. - create_hal_pin
-
Aktivierung/Deaktivierung der Erstellung eines HAL-Pins zur Steuerung der LED. +
Wenn kein HAL-Pin erstellt wurde, kann die LED mit einer Python-Funktion gesteuert werden.
6.13.2. Signale
As an input widget, LED also supports the hal-pin-changed
signal. If you want to get a notification in your code when the LED’s HAL pin was changed, then connect this signal to a handler, for example on_led_pin_changed
and provide the handler as follows:
def on_led_pin_changed(self,hal_led,data=None): print("on_led_pin_changed() - HAL Pin Wert:",hal_led.hal_pin.get())
Dieser wird bei jeder Flanke des Signals und auch beim Programmstart aufgerufen, um den aktuellen Wert zu melden.
6.14. ProgressBar (engl. für Fortschrittsbalken)
Anmerkung
|
Dieses Widget wird möglicherweise entfernt. |
6.14.1. Pins
Der HAL_ProgressBar
ist von gtk.ProgressBar abgeleitet und hat zwei Float-HAL-Eingangspins:
- <widgetname>
-
den aktuell anzuzeigenden Wert
- <widgetname>-scale
-
der maximale absolute Wert der Eingabe
6.14.2. Eigenschaften
HAL_ProgressBar
hat die folgenden Eigenschaften:
- scale
-
Werteskala. +
Legt den maximalen absoluten Wert der Eingabe fest. Entspricht dem Setzen des <widgetname>.scale-Pins.
Ein Float, Bereich von -224 bis +224. - green_limit
-
Untere Grenze der grünen Zone
- yellow_limit
-
Untere Grenze der gelben Zone
- red_limit
-
Untergrenze der roten Zone
- text_template
-
Textvorlage zur Anzeige des aktuellen Wertes des
__<widgetname>__
Pin.
Python-Formatierung kann für dict{"value":value}
verwendet werden.
6.15. ComboBox
Die HAL_ComboBox
ist von der gtk.ComboBox abgeleitet. Sie ermöglicht die Auswahl eines Wertes aus einer Dropdown-Liste.
6.15.1. Pins
Die HAL_ComboBox
exportiert zwei HAL-Pins:
- <widgetname>-f
-
Aktueller Wert, Typ FLOAT
- <widgetname>-s
-
Aktueller Wert, Typ s32
6.15.2. Eigenschaften
HAL_ComboBox
hat die folgende Eigenschaft, die in Glade gesetzt werden kann:
- column
-
Der Spaltenindex. +
Typ s32. +
Gültiger Bereich von -1..100. +
Standardwert ist -1.
In default mode this widgets sets the pins to the index of the chosen list entry. So if your widget has three labels, it may only assume values 0,1 and 2.
In column mode (column > -1), the value reported is chosen from the ListStore array as defined in Glade. So typically your widget definition would have two columns in the ListStore, one with text displayed in the dropdown, and an int or float value to use for that choice.
Es gibt ein Beispiel in configs/apps/by-widget/combobox. {py,ui}
, das den Spaltenmodus verwendet, um einen Gleitkommawert aus dem ListStore auszuwählen.
If you’re confused like me about how to edit ComboBox ListStores and CellRenderer, see https://youtu.be/Z5_F-rW2cL8.
6.16. Bars (engl. für Balken)
HAL_Bar- und HAL_VBar-Widgets für horizontale und vertikale Balken, die Gleitkommawerte darstellen.
6.16.1. Pins
HAL_Bar
und HAL_VBar
haben jeweils einen Eingangs-FLOAT-HAL-Pin.
6.16.2. Eigenschaften
Die beiden Balken HAL_Bar
und HAL_VBar
haben die folgenden Eigenschaften:
- invert
-
Vertauschen Sie die Richtung von Minimum und Maximum. +
Eine invertierte HBar wächst von rechts nach links, eine invertierte VStabi von oben nach unten. - min, max
-
Mindest- und Höchstwert des gewünschten Bereichs. Es wird Fehler ausgelöst, wenn der aktuelle Wert außerhalb dieses Bereichs liegt.
- show limits (engl. für Grenzen zeigen)
-
Dient zum Auswählen/Abwählen des Grenzwerttextes auf der Leiste.
- zero (Null)
-
Zero point of range.
If it is inside of min/max range then the bar will grow from that value and not from the left (or right) side of the widget.
Useful to represent values that may be both positive or negative. - force_width, force_height
-
Erzwungene Breite oder Höhe des Widgets. +
Wenn nicht festgelegt, wird die Größe aus der Verpackung oder aus der festen Widgetgröße abgeleitet und die Leiste füllt den gesamten Bereich aus. - text_template
-
Legt wie bei Label das Textformat für Min/Max/Aktuelle Werte fest. +
Kann verwendet werden, um die Anzeige der Werte auszuschalten. - Wert
-
Setzt die Balkenanzeige auf den eingegebenen Wert. +
Wird nur zum Testen im GLADE-Editor verwendet. +
Der Wert wird von einem HAL-Pin gesetzt. - target value (engl. für Zielwert)
-
Setzt die Zielzeile auf den eingegebenen Wert. +
Wird nur zum Testen im GLADE-Editor verwendet. +
Der Wert kann in einer Python-Funktion festgelegt werden. - target_width
-
Breite der Linie, die den Zielwert markiert.
- bg_color
-
Hintergrund (inaktiv) Farbe des Balken (engl. bar).
- target_color
-
Farbe der Ziellinie.
- z0_color, z1_color, z2_color
-
Farben der verschiedenen Wertzonen. +
Standardwerte sindgrün
,gelb
undrot
. +
Für eine Beschreibung der Zonen siehe Eigenschaften vonz*_border
. - z0_border, z1_border
-
Definieren Sie die Grenzen der Farbzonen. +
Standardmäßig ist nur eine Zone aktiviert. Wenn Sie mehr als eine Zone wünschen, setzen Siez0_border
undz1_border
auf die gewünschten Werte, so dass Zone 0 von 0 bis zur ersten Grenze, Zone 1 von der ersten bis zur zweiten Grenze und Zone 2 von der letzten Grenze bis 1 gefüllt wird. +
Die Ränder werden als Brüche festgelegt. +
Gültige Werte reichen von 0 bis 1.
6.17. Meter
HAL_Meter ist ein Widget ähnlich dem PyVCP-Meter - es stellt einen Gleitkommawert dar.
6.17.1. Pins
HAL_Meter
hat einen Eingangs-FLOAT-HAL-Pin.
6.17.2. Eigenschaften
HAL Meter hat die folgenden Eigenschaften:
- min, max
-
Mindest- und Höchstwert des gewünschten Bereichs.
Es handelt sich nicht um eine Fehlerbedingung, wenn der aktuelle Wert außerhalb dieses Bereichs liegt. - force_size
-
Erzwungener Durchmesser des Widgets.
Wenn nicht festgelegt, wird die Größe aus der Packung oder aus der festen Widgetgröße abgeleitet, und der Zähler füllt den gesamten verfügbaren Platz unter Berücksichtigung des Seitenverhältnisses. - text_template
-
Legt, wie bei Label, das Textformat für den aktuellen Wert fest.
Kann verwendet werden, um die Anzeige des Wertes auszuschalten. - label
-
Großes Etikett über der Metermitte.
- Sublabel
-
Kleines Etikett unter der Mitte des Messgeräts.
- bg_color
-
Hintergrundfarbe des Messgeräts.
- z0_color, z1_color, z2_color
-
Farben der verschiedenen Wertzonen. +
Standardwerte sindgrün
,gelb
undrot
. +
Für eine Beschreibung der Zonen siehe Eigenschaften vonz*_border
. - z0_border, z1_border
-
Definieren Sie die Grenzen der Farbzonen. +
Standardmäßig ist nur eine Zone aktiviert. Wenn Sie mehr als eine Zone wünschen, setzen Siez0_border
undz1_border
auf die gewünschten Werte, so dass Zone 0 vom Minimum bis zum ersten Rand, Zone 1 vom ersten bis zum zweiten Rand und Zone 2 vom letzten Rand bis zum Maximum gefüllt wird. +
Die Ränder werden als Werte im Bereich min-max eingestellt.
6.18. HAL_Graph
Dieses Widget dient zum Auftragen von Werten über die Zeit.
6.19. Gremlin tool path preview for NGC files
Gremlin is a plot preview widget similar to the AXIS preview window. It assumes a running LinuxCNC environment like AXIS or Touchy. To connect to it, inspects the INI_FILE_NAME environment variable. Gremlin displays the current NGC file - it does monitor for changes and reloads the ngc file if the file name in AXIS/Touchy changes. If you run it in a GladeVCP application when LinuxCNC is not running, you might get a traceback because the Gremlin widget can’t find LinuxCNC status, like the current file name.
6.19.1. Pins
Gremlin exportiert keine HAL-Pins.
6.19.2. Eigenschaften
Gremlin hat die folgenden Eigenschaften:
- enable_dro
-
This displays the dro on the graphics.
Default = true. - show_velocity
-
Dies zeigt die Werkzeuggeschwindigkeit an.
Vorteinstellung = true. - use_commanded
-
Dies wählt die zu verwendende DRO aus: befohlene oder tatsächliche Werte.
Voreinstellung = true. - metric_units
-
Dies legt fest was die DRO nutzt: metrische oder imperiale Einheiten.
Voreinstellung = true. - show_rapids
-
Dies legt fest, dass der Plotter die schnelle Bewegungen zeigt.
Voreinstellung = true. - show_dtg_
-
Hiermit wird die Anzeige des Restweges auf der DRO ausgewählt.
Voreinstellung = true. - use_relative
-
Hiermit wird festgelegt, dass die Anzeige der Werte relativ zu den Koordinaten des Benutzersystems oder der Maschine erfolgen soll.
Voreinstellung = true. - show_live_plot
-
Hiermit wird dem Plotter mitgeteilt, ob er zeichnen soll oder nicht.
Voreinstellung = true. - show_limits
-
Hiermit wird der Plotter angewiesen, die Grenzen der Maschine anzuzeigen.
Voreinstellung = true. - show_lathe_radius
-
Hiermit wird die DRO Anzeige der X-Achse in Radius oder Durchmesser gewählt, wenn der Drehmaschinenmodus aktiviert ist (wählbar in der INI-Datei mit LATHE = 1).
Voreinstellung = true. - show_extents_option
-
This tells the plotter to show the machine’s extents.
Default = true. - show_tool
-
Hiermit wird der Plotter angewiesen, das Werkzeug zu zeichnen.
Voreinstellung = true. - show_program
-
Shows the G-code program.
Default = True - use_joints_mode
-
Wird in nicht trivialkins Maschinen (z.B. Robotern) verwendet.
Standard = false. - grid_size
-
Legt die Größe des Gitters fest (nur in den Ansichten X, Y und Z sichtbar). +
Standardwert ist 0 - use_default_controls
-
This disables the default mouse controls.
This is most useful when using a touchscreen as the default controls do not work well. You can programmatically add controls using Python and the handler file technique.
Default = true. - view (engl. für Sicht)
-
Kann einer der Werte
x
,y
,y2
,z
,z2
,p
(Perspektive) sein.
Standardmäßig wird die Ansichtz
verwendet. - enable_dro
-
Typ = boolesch. +
Ob ein DRO auf dem Plot gezeichnet werden soll oder nicht. +
Voreinstellung = true. - mouse_btn_mode
-
Typ = Ganzzahl.
Maustastenbehandlung: führt zu verschiedenen Funktionen der Taste:-
0 = default: left rotate, middle move, right zoom
-
1 = left zoom, middle move, right rotate
-
2 = left move, middle rotate, right zoom
-
3 = left zoom, middle rotate, right move
-
4 = left move, middle zoom, right rotate
-
5 = left rotate, middle zoom, right move
-
6 = left move, middle zoom, right zoom
-
Modus 6 wird für Plasmas und Drehbänke empfohlen, da für diese Maschinen keine Rotation erforderlich ist.
6.19.3. Direkte Programmsteuerung
Es gibt mehrere Möglichkeiten, das Widget direkt mit Python zu steuern.
Verwenden Sie GObject, um die oben aufgeführten Eigenschaften einzustellen:
[widget name].set_property('view','P')
[widget name].set_property('metric_units',False)
[widget name].set_property('use_default_controls',False)
[widget name].set_property('enable_dro' False)
[widget name].set_property('show_program', False)
[widget name].set_property('show_limits', False)
[widget name].set_property('show_extents_option', False)
[widget name].set_property('show_live_plot', False)
[widget name].set_property('show_tool', False)
[widget name].set_property('show_lathe_radius',True)
[widget name].set_property('show_dtg',True)
[widget name].set_property('show_velocity',False)
[widget name].set_property('mouse_btn_mode', 4)
Es gibt Python-Methoden:
[widget name].show_offsets = True
[widget name].grid_size = .75
[widget name].select_fire(event.x,event.y)
[widget name].select_prime(event.x,event.y)
[widget name].start_continuous_zoom(event.y)
[widget name].set_mouse_start(0,0)
[widget name].gremlin.zoom_in()
[widget name].gremlin.zoom_out()
[widget name].get_zoom_distance()
[widget name].set_zoom_distance(dist)
[widget name].clear_live_plotter()
[widget name].rotate_view(x,y)
[widget name].pan(x,y)
- Hinweise
-
-
Wenn Sie alle Plot-Optionen auf false, show_offsets aber auf true setzen, erhalten Sie eine Seite mit Offsets anstelle einer grafischen Darstellung.
-
If you get the zoom distance before changing the view then reset the zoom distance, it is much more user friendly.
-
wenn Sie ein Element in der Vorschau auswählen, wird das ausgewählte Element als Rotationsmittelpunkt verwendet
-
6.20. HAL_Offset
Das HAL_Offset
-Widget wird verwendet, um den Offset einer einzelnen Achse anzuzeigen.
6.20.1. Eigenschaften
HAL_Offset
hat die folgenden Eigenschaften:
- display_units_mm
-
Display in metric units.
- joint_number
-
Used to select which axis (technically which joint) is displayed.
On a trivialkins machine (mill, lathe, router) axis vs. joint number are:0:X 1:Y 2:Z 3:A 4:B 5:C 6:U 7:V 8:W
- mm_text_template
-
Sie können die Python-Formatierung verwenden, um die Position mit unterschiedlicher Genauigkeit anzuzeigen.
- imperial_text_template
-
Sie können die Python-Formatierung verwenden, um die Position mit unterschiedlicher Genauigkeit anzuzeigen.
- reference_type
-
0:G5x 1:Werkzeug 2:G92 3:Drehung um Z
6.21. DRO-Widget
Das DRO-Widget wird verwendet, um die aktuelle Achsenposition anzuzeigen.
6.21.1. Eigenschaften
Es hat die folgenden Eigenschaften:
- display_units_mm
-
Used to toggle the display units between metric and imperial. Default is False.
- actual (engl. für tatsächlich)
-
Select actual (feedback) position or commanded position. Default is True.
- Durchmesser
-
Display diameter for a lathe. Default is False.
- mm_text_template
-
You can use Python formatting to display the position with different precision. Default is "%10.3f".
- imperial_text_template
-
You can use Python formatting to display the position with different precision. Default is "%9.4f".
- joint_number
-
Used to select which axis (technically which joint) is displayed. Default is 0.
On a trivialkins machine (mill, lathe, router) axis vs. joint number are:0:X 1:Y 2:Z 3:A 4:B 5:C 6:U 7:V 8:W +
- reference_type
-
-
0 =
absolute
(machine origin). -
1 =
relative
(to current user coordinate origin - G5x). -
2 =
distance-to-go
(relative to current user coordinate origin). Default is 0.
-
- font_family
-
Specify the font family e.g. mono. Defaults to sans. If the font does not exist then the current system font will be used. Default is sans.
- font_size
-
Specify the size of the font between 8 and 96. Default is 26.
- font_weight
-
Specify the weight of the font. Select from lighter, normal, bold, or bolder. Default is bold.
- unhomed_color
-
The text color when unhomed specified as a Gdk.RGBA color. Default is red, Gdk.RGBA(red=1.000000, green=0.000000, blue=0.000000, alpha=1.000000)
- homed_color
-
The text color when homed specified as a Gdk.RGBA color. Default is green, Gdk.RGBA(red=0.000000, green=0.501961, blue=0.000000, alpha=1.000000)
- Hinweise
-
-
If you want the display to be right justified, set the Horizontal Alignment to
End
. -
The background of the widget is actually see through, so if you place it over an image, the DRO numbers will show on top of it with no background. There is a special technique to do this. See the animated function diagrams below.
-
The DRO widget is a modified gtk label widget. As such, much of what can be done to a gtk label can be done to the DRO widget.
-
The font properties may also be set from a css stylesheet which has the highest priority and will override values set by GObject properties.
-
6.21.2. Direkte Programmsteuerung
Es gibt mehrere Möglichkeiten, das Widget direkt mit Python zu steuern.
- Using GObject to set the above listed properties
[widget name].set_property("display_units_mm", True)
[widget name].set_property("actual", True)
[widget name].set_property("diameter", True)
[widget name].set_property("mm_text_template", "%10.3f")
[widget name].set_property("imperial_text_template", "%9.4f")
[widget name].set_property("joint_number", 3)
[widget name].set_property("reference_type", 3)
[widget name].set_property("font_family", "mono")
[widget name].set_property("font_size", 30)
[widget name].set_property("font_weight", "bold")
# it is easier to read colors by calling a function:
def str_to_rgba(color):
c = Gdk.RGBA()
c.parse(color)
return c
[widget name].set_property("unhomed_color", str_to_rgba("magenta"))
[widget name].set_property("homed_color", str_to_rgba("cyan"))
- Using a CSS stylesheet to set font properties
-
Colors may be specified in one of several formats, these would all specify the same color, red, *#ff0000, *rgb(255,0,0), or rgba(255,0,0,255).
Colors may be referenced either collectively:
.dro_unhomed {color: magenta}
.dro_homed {color: cyan}
or individually by widget name:
#[widget name].dro_unhomed {color: magenta}
#[widget name].dro_homed {color: cyan}
The other style properties need to be referenced by widget name:
#[widget name], #[widget name], #[widget name] {
font-family: mono;
font-size: 60px;
font-weight: lighter;
}
- There are two Python methods
[widget name].set_dro_inch()
[widget name].set_dro_metric()
6.22. Combi_DRO Widget
Das Combi_DRO
-Widget wird verwendet, um die aktuelle, die relative Achsenposition und die zu fahrende Strecke in einem DRO anzuzeigen.
Durch Klicken auf das DRO wird die Reihenfolge der DRO umgeschaltet.
Im relativen Modus wird das aktuelle Koordinatensystem angezeigt.
6.22.1. Eigenschaften
Combi_DRO
hat die folgenden Eigenschaften:
- joint_number
-
Used to select which axis (technically which joint) is displayed.
On a trivialkins machine (mill, lathe, router) axis/joint numbers are:0:X 1:Y 2:Z usw.
- actual (engl. für tatsächlich)
-
Wählen Sie die tatsächliche (Rückmeldung) oder die befohlene Position.
- metric_units
-
Dient zum Umschalten der Anzeigeeinheiten zwischen metrisch und imperial.
- auto_units
-
Die Einheiten werden zwischen metrisch und imperial umgeschaltet, je nachdem, ob der aktive G-Code G20 oder G21 ist. +
Voreinstellung ist TRUE. - Durchmesser
-
Ob die Position als Durchmesser oder Radius angezeigt werden soll. +
Im Durchmessermodus zeigt die Positionsanzeige den Gelenkwert multipliziert mit 2 an. - mm_text_template
-
Sie können die Python-Formatierung verwenden, um die Position mit unterschiedlicher Genauigkeit anzuzeigen.
Standard ist "%10.3f". - imperial_text_template
-
Sie können die Python-Formatierung verwenden, um die Position mit unterschiedlicher Genauigkeit anzuzeigen.
Standard ist "%9.4f". - homed_color
-
Die Vordergrundfarbe der DRO-Nummern, wenn das Gelenk referenziert ist.
Standard ist grün. - unhomed_color
-
Die Vordergrundfarbe der DRO-Nummern, wenn das Gelenk nicht referenziert ist.
Standard ist rot. - abs_color
-
Die Hintergrundfarbe der DRO, wenn die Haupt-DRO absolute Koordinaten anzeigt.
Standard ist blau. - rel_color
-
Die Hintergrundfarbe des DRO, wenn das Haupt-DRO relative Koordinaten anzeigt.
Standard ist schwarz. - dtg_color
-
Die Hintergrundfarbe der DRO, wenn die Haupt-DRO die verbleibende Entfernung anzeigt.
Standard ist gelb. - font_size
-
Die Schriftgröße der großen Zahlen, die kleinen Zahlen werden 2,5 mal kleiner sein.
Der Wert muss eine ganze Zahl im Bereich von 8 bis 96 sein.
Standardwert ist 25. - toggle_readout
-
Ein linker Mausklick schaltet die DRO-Anzeige zwischen den verschiedenen Modi um ["Rel", "Abs", "DTG"].
Durch Deaktivieren des Kontrollkästchens können Sie dieses Verhalten abschalten. Das Umschalten kann immer noch mit[Widgetname].toggle_readout()
durchgeführt werden.
Der Wert muss boolesch sein.
Voreinstellung ist TRUE. - cycle_time
-
The time the DRO waits between two polls.
This setting should only be changed if you use more than 5 DRO at the same time, i.e. on a 6 axis config, to avoid that the DRO slows down the main application too much.
The value must be an integer in the range of 100 to 1000. FIXME unit=ms ?
Default is 150.
6.22.2. Direkte Programmsteuerung
Verwenden Sie GObject, um die oben aufgeführten Eigenschaften einzustellen:
[widget name].set_property(property, value)
Es gibt mehrere Python-Methoden zur Steuerung des Widgets:
-
[Widgetname].set_to_inch(state)
Legt fest, dass die DRO imperiale Einheiten anzeigt.
state
= boolesch (True oder False)
Voreinstellung ist FIXME. -
[Widgetname].set_auto_units(state)
Wenn True, ändert die DRO die Einheiten entsprechend dem aktiven G-Code (G20 / G21).
state
= boolean (Wahr oder Falsch)
Standard ist True. -
[Name des Widgets].set_to_diameter(state)
Wenn True, zeigt die DRO den Durchmesser und nicht den Radius an, d. h. den Achsenwert multipliziert mit 2 (speziell für Drehmaschinen erforderlich).
state
= boolean (Wahr oder Falsch)
Der Standardwert ist Falsch. -
[Widgetname].toggle_readout()
Schaltet die Reihenfolge des DRO im Widget um. -
[Widget-Name].change_axisletter(Buchstabe)
Ändert den automatisch angegebenen Achsenbuchstaben.
Sehr nützlich, um eine Drehmaschine DRO von X auf R oder D zu ändern.
letter = Zeichenfolge -
[Widgetname].get_order()
Gibt die Reihenfolge der DRO im Widget zurück, die hauptsächlich dazu dient, sie konsistent zu halten.
Die Reihenfolge wird auch mit dem Klicksignal übertragen.
Gibt eine Liste mit der Reihenfolge zurück. -
[Name des Widgets].set_order(order)
Legt die Reihenfolge der DRO fest, die hauptsächlich verwendet wird, um sie konsistent zu halten.
order
= Listenobjekt, muss eines der folgenden sein:-
["Rel", "Abs", "DTG"]
(Standard) -
["DTG", "Rel", "Abs"]
-
["Abs", "DTG", "Rel"]
-
-
[Widgetname].get_position()
Liefert die Position des DRO als eine Liste von Floats.
Die Reihenfolge ist unabhängig von der auf dem DRO angezeigten Reihenfolge und wird als[Absolut , relativ , DTG]
angegeben.
-
Absolut
= die Maschinenkoordinaten, abhängig von der tatsächlichen Eigenschaft, die eine tatsächliche oder befohlene Position ergibt.
-
Relativ
= sind die Koordinaten des aktuellen Koordinatensystems.
-
DTG
= die zu gehende Strecke.
Wird meistens 0 sein, da diese Funktion aufgrund von Zeitverzögerungen nicht verwendet werden sollte, während sich die Maschine bewegt.
-
Das Widget sendet die folgenden Signale aus:
-
clicked
Dieses Signal wird ausgesendet, wenn der Benutzer auf das Combi_DRO-Widget geklickt hat.
Es wird die folgenden Daten senden:-
widget
= Widget-Objekt
Das Widget-Objekt, welches das Signal sendet. -
joint_number
= ganze Zahl
Die gemeinsame Nummer des DRO, wobei 0:X 1:Y 2:Z etc. -
order
= Listenobjekt +
Die Reihenfolge des DRO in diesem Widget. +
Die Reihenfolge kann verwendet werden, um andere Combi_DRO-Widgets mit[widget name].set_order(order)
auf die gleiche Reihenfolge zu setzen.
-
-
units_changed
+
Dieses Signal wird ausgegeben, wenn die DRO-Einheiten gewechselt werden. +
Es sendet die folgenden Daten:-
widget
= Widget-Objekt
Das Widget-Objekt, welches das Signal sendet. -
metric_units
= boolesch +
True, wenn die DRO metrische Einheiten anzeigt, False, wenn die Anzeige imperial ist.
-
-
system_changed
+
Dieses Signal wird ausgegeben, wenn die DRO-Einheiten gewechselt werden. +
Es sendet die folgenden Daten:-
widget
= Widget-Objekt
Das Widget-Objekt, welches das Signal sendet. -
system
= string
The actual coordinate system. Will be one of G54 G55 G56 G57 G58 G59 G59.1 G59.2 G59.3 or Rel if none has been selected at all, what will only happen in Glade with no LinuxCNC running.
-
Es gibt einige Informationen, die Sie über Befehle erhalten können und die für Sie von Interesse sein könnten:
-
[Widgetname].system
Das eigentliche System, wie im Signal system_changed erwähnt. -
[Widget-Name].homed
+
True, wenn das Gelenk referenziert ist. -
[Widgetname].machine_units
+
0 wenn imperial, 1 wenn metrisch.
X = Relativer Modus +
Y = Absoluter Modus +
Z = DTG-Modus
6.23. IconView (Dateiauswahl)
Dies ist ein Touchscreen-freundliches Widget zur Auswahl einer Datei und zum Wechseln von Verzeichnissen.
6.23.1. Eigenschaften
Das IconView
-Widget hat die folgenden Eigenschaften:
- icon_size
-
Legt die Größe des angezeigten Symbols fest. +
Erlaubte Werte sind Ganzzahlen im Bereich von 12 bis 96. +
Voreinstellung ist 48. - start_dir
-
Legt das Verzeichnis fest, in dem das Widget beim ersten Mal angezeigt wird.
Muss ein String sein, der einen gültigen Verzeichnispfad enthält.
Standard ist "/". - jump_to_dir
-
Legt das Verzeichnis fest, in das gesprungen werden soll und das durch die entsprechende Schaltfläche in der unteren Schaltflächenliste ausgewählt wird (die 5. Schaltfläche von links).
Muss ein String sein, der einen gültigen Verzeichnispfad enthält.
Voreinstellung ist "\~". - filetypes
-
Legt den Dateifilter für die anzuzeigenden Objekte fest.
Muss eine Zeichenkette sein, die eine durch Komma getrennte Liste von Erweiterungen enthält, die angezeigt werden sollen.
Standard ist "ngc,py". - sortorder
-
Legt die Sortierreihenfolge des angezeigten Symbols fest. +
Muss ein ganzzahliger Wert von 0 bis 3 sein, mit den entsprechenden Konstanten:
-
0 = ASCENDING (engl. für aufsteigend) (nach Dateinamen sortiert)
-
1 = DESCENDING (engl. für absteigend) (Sortierung nach Dateinamen)
-
2 = FOLDERFIRST (zuerst die Ordner, dann die Dateien anzeigen), Standard
-
3 = FILEFIRST (zuerst die Dateien, dann die Ordner anzeigen)
-
6.23.2. Direkte Programmsteuerung
Verwenden Sie GObject, um die oben aufgeführten Eigenschaften einzustellen:
[Widgetname].set_property(Eigenschaft,Wert)
Es gibt Python-Methoden zur Steuerung des Widgets:
-
[widget name].show_buttonbox(state)
If False the bottom button box will be hidden.
This is helpful in custom screens, with special buttons layouts to not alter the layout of the GUI. Good example for that is GMOCCAPY.
state
= boolean (True or False).
Default is True. -
[Widgetname].show_filelabel(state)
+
Bei True wird das Dateilabel (zwischen dem IconView-Fenster und dem unteren Schaltflächenfeld) angezeigt. +
Das Ausblenden dieses Labels kann Platz sparen, aber das Anzeigen ist sehr nützlich für die Fehlersuche. +
state
= boolescher Wert (True oder False). +
Voreinstellung ist True. -
[Widgetname].set_icon_size(iconsize)
+
Setzt die Größe des Icons. +
Muss eine ganze Zahl im Bereich von 12 bis 96 sein. +
Voreinstellung = 48. -
[Widgetname].set_directory(Verzeichnis)
+
Ermöglicht das Setzen eines anzuzeigenden Verzeichnisses. +
Verzeichnis
= String (ein gültiger Dateipfad). -
[Widgetname].set_filetypes(Dateitypen)
+
Legt den zu verwendenden Dateifilter fest. +
Es werden nur Dateien mit den angegebenen Erweiterungen angezeigt. +
Dateitypen
= String mit einer durch Komma getrennten Liste von Erweiterungen. +
Voreinstellung = "ngc,py". -
[Widgetname].get_selected()
+
Gibt den Pfad der ausgewählten Datei zurück, oderNone
, wenn ein Verzeichnis ausgewählt wurde. -
[Widgetname].refresh_filelist()
+
Aktualisiert die Dateiliste. +
Wird benötigt, wenn Sie eine Datei hinzufügen, ohne das Verzeichnis zu ändern.
If the button box has been hidden, you can reach the functions of this button through its clicked signals like so:
[widget name].btn_home.emit("clicked")
[widget name].btn_jump_to.emit("clicked")
[widget name].btn_sel_prev.emit("clicked")
[widget name].btn_sel_next.emit("clicked")
[widget name].btn_get_selected.emit("clicked")
[widget name].btn_dir_up.emit("clicked")
[widget name].btn_exit.emit("clicked")
6.23.3. Signale
Das Widget sendet die folgenden Signale aus:
-
selected
(engl. für ausgewählt) +
Dieses Signal wird ausgegeben, wenn der Benutzer ein Symbol auswählt. +
Es gibt einen String zurück, der einen Dateipfad enthält, wenn eine Datei ausgewählt wurde, oderNone
, wenn ein Verzeichnis ausgewählt wurde. -
sensitive
This signal is emitted when the buttons change their state from sensitive to not sensitive or vice versa.
This signal is useful to maintain surrounding GUI synchronized with the button of the widget. See GMOCCAPY as example.
It will return the buttonname and the new state:
-
Der Name der Schaltfläche ist einer der folgenden:
btn_home
,btn_dir_up
,btn_sel_prev
,btn_sel_next
,btn_jump_to
oderbtn_select
. -
state
ist ein boolescher Wert und wird True oder False sein.
-
-
exit
+
Dieses Signal wird ausgegeben, wenn der Exit-Button gedrückt wurde, um die IconView zu schließen. +
Meistens benötigt, wenn die Anwendung als eigenständige Anwendung gestartet wird.
6.24. Rechner-Widget
Dies ist ein einfaches Taschenrechner-Widget, das für numerische Eingaben verwendet werden kann. +
Sie können die Anzeige voreinstellen und das Ergebnis oder den voreingestellten Wert abrufen.
6.24.1. Eigenschaften
Rechner
(engl. calculator) hat folgende Eigenschaften:
- is_editable
-
Damit kann die Eingabeanzeige über eine Tastatur eingegeben werden.
- font
-
Hier können Sie die Schriftart für die Anzeige einstellen.
6.24.2. Direkte Programmsteuerung
Es gibt mehrere Möglichkeiten, das Widget direkt mit Python zu steuern.
Verwenden Sie goobject, um die oben aufgeführten Eigenschaften einzustellen:
[widget name].set_property("is_editable",True)
[widget name].set_property("font","sans 25")
Es gibt Python-Methoden:
-
[Widgetname].set_value(2.5)
Damit ist die Anzeige voreingestellt und wird aufgezeichnet. -
[Widgetname].set_font("sans 25")
-
[Widgetname].set_editable(True)
-
[Widgetname].get_value()
Gibt den berechneten Wert zurück - eine Fließkommazahl. -
[Widgetname].set_editable(True)
-
[Widgetname].get_preset_value()
Gibt den aufgezeichneten Wert zurück: eine Fließkommazahl.
6.25. Werkzeugeditor-Widget (engl. tooleditor widget)
Dies ist ein "Werkzeug-Editor"-Widget zum Anzeigen und Ändern einer Werkzeugdatei. +
Im Drehmaschinenmodus werden Verschleißkorrekturen und Werkzeugkorrekturen separat angezeigt. +
Verschleißkorrekturen werden durch Werkzeugnummern über 10000 (Fanuc-Stil) gekennzeichnet. +
Es überprüft die aktuelle Datei einmal pro Sekunde, um zu sehen, ob LinuxCNC es aktualisiert.
Anmerkung
|
LinuxCNC erfordert Mapping von Werkzeug-Aufrufe, um Verschleiß-Offsets anzuwenden. |
6.25.1. Eigenschaften
tooleditor
hat die folgenden Eigenschaften:
- font
-
Display font to use
- hide_columns
-
Dadurch werden die angegebenen Spalten ausgeblendet. +
Die Spalten werden (in dieser Reihenfolge) wie folgt bezeichnet:s,t,p,x,y,z,a,b,c,u,v,w,d,i,j,q
. +
Sie können eine beliebige Anzahl von Spalten ausblenden, einschließlich der Auswahl und der Kommentare. - lathe_display_type
-
Show lathe format
6.25.2. Direkte Programmsteuerung
Es gibt mehrere Möglichkeiten, das Widget direkt mit Python zu steuern.
Verwenden Sie goobject, um die oben aufgeführten Eigenschaften einzustellen:
[Widgetname].set_properties('hide_columns','uvwijq')
Dadurch würden die Spalten uvwij und q ausgeblendet und alle anderen angezeigt.
Es gibt Python-Methoden:
-
[Widgetname].set_visible("ijq",False)
Blendet die Spalten ij und Q aus und belässt den Rest so, wie er war. -
[Widgetname].set_filename(pfad_zur_datei)
Setzt und lädt die Werkzeugdatei. -
[Widgetname].reload(None)
Lädt die aktuelle Werkzeugdatei neu. -
[Widgetname].set_font('sans 16,tab='1')
+
Setzt die (Pango)-Schriftart für die Registerkarte, den Spaltentitel und die Werkzeugdaten. +
Dieall_offsets
,wear_offsets
,tool_offsets
können gleichzeitig gesetzt werden, indem man 1, 2 und/oder 3 an den Tab-String anhängt. +
Standardmäßig sind alle Registerkarten eingestellt. -
[Widgetname].set_title_font('sans 16,tab='1')
+
Setzt die (Pango)-Schriftart nur für die Spaltentitel. +
Dieall_offsets
,wear_offsets
,tool_offsets
können gleichzeitig gesetzt werden, indem man 1, 2 und/oder 3 an den Tab-String anhängt. +
Standardmäßig sind alle Tabulatoren gesetzt. -
[Widgetname].set_tab_font('sans 16,tab='1')
+
Setzt die (Pango)-Schriftart nur auf den Registerkarten. +
Dieall_offsets
,wear_offsets
,tool_offsets
können gleichzeitig gesetzt werden, indem man 1, 2 und/oder 3 an den Tab-String anhängt. +
Standardmäßig sind alle Tabs gesetzt. -
[Widgetname].set_col_visible("abcUVW", False, tab='1')
+
Dies würde die abcuvw-Spalten auf der Registerkarte 1 (all_offsets) ausblenden (False) -
[widget name].set_lathe_display(value)
+
Blendet die Verschleiß- und Werkzeugkorrekturtabellen für Drehbänke ein oder aus -
[Widgetname].get_toolinfo(toolnum)
+
Gibt das Werkzeuginformationsfeld der angeforderten Werkzeugnummer oder des aktuellen Werkzeugs zurück, wenn keine Werkzeugnummer angegeben ist. +
Gibt None zurück, wenn das Werkzeug nicht in der Tabelle gefunden wurde oder wenn es kein aktuelles Werkzeug gibt. -
[Widgetname].hide_buttonbox(self, True)
+
Komfortable Methode zum Ausblenden von Schaltflächen. +
Sie müssen diese Methode nach show_all() aufrufen. -
[Widgetname].get_selected_tool()
+
Gibt die vom Benutzer ausgewählte (hervorgehobene) Werkzeugnummer zurück. -
[Widgetname].set_selected_tool(toolnumber)
+
Wählt das gewünschte Werkzeug aus (markiert es).
6.26. Offset-Seite
Das Widget Offsetpage
dient der Anzeige/Bearbeitung der Offsets aller Achsen.
Es hat praktische Schaltflächen für die Nullstellung von G92- und Rotation-Around-Z-Offsets.
Sie können den Bearbeitungsmodus nur auswählen, wenn die Maschine eingeschaltet und im Leerlauf ist.
Zu diesem Zeitpunkt können Sie die Offsets in der Tabelle direkt bearbeiten. Heben Sie die Auswahl der Schaltfläche "Bearbeiten" auf, damit die Offset-Seite die Änderungen wiedergeben kann.
6.26.1. Eigenschaften
Es hat die folgenden Eigenschaften:
- display_units_mm
-
Display in metrice units
- hide_columns
-
Eine Liste der auszublendenden Spalten ohne Leerzeichen. Die Spalten werden (in dieser Reihenfolge) wie folgt bezeichnet:
xyzabcuvwt
.
Sie können jede der Spalten ausblenden. - hide_rows
-
Eine Liste der auszublendenden Zeilen ohne Leerzeichen.
Die Zeilen werden (der Reihe nach) wie folgt bezeichnet:0123456789abc
.
Sie können jede der Zeilen ausblenden. - font
-
Legt Art und Größe der Schriftart fest.
- highlight_color
-
Beim Bearbeiten ist dies die Hervorhebungsfarbe.
- foreground_color
-
Wenn
OffsetPage
ein aktives Benutzerkoordinatensystem erkennt, wird diese Farbe für den Text verwendet. - mm_text_template
-
Sie können die Python-Formatierung verwenden, um die Position mit unterschiedlicher Genauigkeit anzuzeigen.
- imperial_text_template
-
Sie können die Python-Formatierung verwenden, um die Position mit unterschiedlicher Genauigkeit anzuzeigen.
6.26.2. Direkte Programmsteuerung
Es gibt mehrere Möglichkeiten, das Widget direkt mit Python zu steuern.
Verwenden Sie goobject, um die oben aufgeführten Eigenschaften einzustellen:
[widget name].set_property("highlight_color",gdk.Color('blue'))
[widget name].set_property("foreground_color",gdk.Color('black'))
[widget name].set_property("hide_columns","xyzabcuvwt")
[widget name].set_property("hide_rows","123456789abc")
[widget name].set_property("font","sans 25")
Es gibt Python-Methoden zur Steuerung des Widgets:
-
[widget name].set_filename("../../../configs/sim/gscreen/gscreen_custom/sim.var")
-
[widget name].set_col_visible("Yabuvw",False)
-
[widget name].set_row_visible("456789abc",False)
-
[widget name].set_to_mm()
-
[widget name].set_to_inch()
-
[widget name].hide_button_box(True)
-
[widget name].set_font("sans 20")
-
[widget name].set_highlight_color("violet")
-
[widget name].set_foreground_color("yellow")
-
[Widgetname].mark_active("G55")
Ermöglicht es Ihnen, eine Zeile direkt zu markieren, z.B. wenn Sie Ihre eigenen Navigationskontrollen verwenden möchten. Siehe das Kapitel über GMOCCAPY. -
[Widgetname].selection_mask = ("Werkzeug", "Rot", "G5x")
+
Diese Zeilen sind im Bearbeitungsmodus NICHT auswählbar. -
[Widgetname].set_names([['G54','Default'],["G55", "Vice1"],['Rot','Rotational']])
+
Damit können Sie den Text der Spalte "T" in jeder beliebigen Zeile festlegen. +
Es handelt sich um eine Liste von Offset-Namen/Benutzernamen-Paaren. +
Der Standardtext ist derselbe wie der Offsetname. -
[Widgetname].get_names()` +
Diese Funktion gibt eine Liste von Paaren aus Zeilen-Schlüsselwort/Benutzername zurück. +
Die Spalte mit den Benutzernamen ist editierbar, so dass das Speichern dieser Liste benutzerfreundlich ist. +
Sieheset_names
oben.
6.27. HAL_sourceview-Widget
This is for displaying and simple editing of G-code. It looks for .ngc
highlighting specs in ~/share/gtksourceview-4/language-specs/
. The current running line will be highlighted.
Mit externem Python-Glue-Code kann dies:
-
Nach Text suchen, Änderungen rückgängig machen und Wiederherstellen,
-
für die Auswahl von Programmzeilen genutzt werden.
6.27.1. Direkte Programmsteuerung
Es gibt Python-Methoden zur Steuerung des Widgets:
-
[widget name].redo()
+
Wiederholung einer Ebene von Änderungen. -
[widget name].undo()` +
Rückgängig machen einer Ebene von Änderungen -
[Widgetname].text_search(direction=True,mixed_case=True,text='G92')
+
Sucht vorwärts (direction = True) oder rückwärts, +
Sucht mit gemischter Groß- und Kleinschreibung (mixed_case = True) oder exakter Übereinstimmung -
[Widgetname].set_line_number(Zeilennummer)
+
Setzt die hervorzuhebende Zeile. +
Verwendet die Zeilennummern der Quellansicht. -
[Widgetname].get_line_number()
+
Gibt die aktuell hervorgehobene Zeile zurück. -
[Widget-Name].line_up()` +
Verschiebt die markierte Zeile um eine Zeile nach oben. -
[Name des Widgets].line_down()
Verschiebt die markierte Zeile um eine Zeile nach unten. -
[Widgetname].load_file('Dateiname')
Lädt eine Datei.
Die Verwendung von None (keine Zeichenkette für den Dateinamen) lädt das gleiche Programm erneut. -
[Widget-Name].get_filename()
FIXME Beschreibung
6.28. MDI-Geschichte
This is for displaying and entering MDI codes.
It will be automatically grayed out when MDI is not available, e.g., during E-stop and program running.
6.28.1. Eigenschaften
- font_size_tree
-
Ganzzahliger Wert zwischen 8 und 96.
Ändert die Standardschriftgröße der Baumansicht auf den ausgewählten Wert. - font_size_entry
-
Ganzzahliger Wert zwischen 8 und 96. +
Ändert die Standardschriftgröße der Baumansicht auf den ausgewählten Wert.
- use_double_click
-
Boolean, True enables the mouse double click feature and a double click on an entry will submit that command.
It is not recommended to use this feature on real machines, as a double click on a wrong entry may cause dangerous situations.
6.28.2. Direkte Programmsteuerung
Verwenden Sie goobject, um die oben aufgeführten Eigenschaften einzustellen:
[widget name].set_property("font_size_tree",10)
[widget name].set_property("font_size_entry",20)
[widget name].set_property("use_double_click",False)
6.29. Animierte Funktionsdiagramme: HAL-Widgets in einer Bitmap
Für einige Anwendungen kann es wünschenswert sein, ein Hintergrundbild zu haben - wie ein Funktionsdiagramm - und Widgets an geeigneten Stellen in diesem Bild zu positionieren. Eine gute Kombination ist das Setzen eines Bitmap-Hintergrundbildes, z.B. aus einer .png-Datei, das Festlegen der Größe des GladeVCP-Fensters und die Verwendung des Glade Fixed-Widgets zur Positionierung von Widgets auf diesem Bild. Der Code für das folgende Beispiel ist in configs/apps/gladevcp/animated-backdrop
zu finden:
7. Referenz zu Aktions-Widgets
GladeVCP enthält eine Sammlung von "vorgefertigten Aktionen" (engl. canned actions) namens VCP Action Widgets für den Glade-Benutzeroberflächeneditor.
Anmerkung
|
Other than HAL widgets, which interact with HAL pins, VCP Actions interact with LinuxCNC and the G-code interpreter. |
VCP Action Widgets sind von dem Gtk.Action
Widget abgeleitet.
Das Action-Widget in Kürze:
-
It is an object available in Glade
-
It has no visual appearance by itself
-
Its purpose: Associate a visible, sensitive UI component like menu, toolbutton, button with a command. See these widget’s General→Related→Action property.
-
The "canned action" will be executed when the associated UI component is triggered (button press, menu click..).
-
It provides an easy way to execute commands without resorting to Python programming.
Das Erscheinungsbild der VCP-Aktionen in Glade sieht in etwa wie folgt aus:
Hover über Werkzeugspitzen (engl. tooltips) liefert eine Beschreibung.
7.1. VCP Action-Widgets
VCP Action widgets are one-shot type widgets. They implement a single action and are for use in simple buttons, menu entries or radio/check groups.
7.2. VCP Action Python
This widget is used to execute small arbitrary Python code.
Der Befehlsstring kann spezielle Schlüsselwörter für den Zugriff auf wichtige Funktionen enthalten.
-
ACTION für den Zugriff auf die ACTION-Befehlsbibliothek.
-
GSTAT
für den Zugriff auf die Gstat-Bibliothek für Statusmeldungen. -
INFO für den Zugriff auf gesammelte Daten aus der INI-Datei.
-
HAL für den Zugriff auf das HAL
linuxcnc
Python-Modul -
STAT
für den Zugriff auf LinuxCNC’s rohen Status über das LinuxCNC Python Modul. -
CMD
für den Zugriff auf LinuxCNC-Befehle über das LinuxCNC-Python-Modul. -
EXT
für den Zugriff auf die Handler-Dateifunktionen, falls verfügbar. -
linuxcnc
für den Zugriff auf das LinuxCNC-Python-Modul. -
self
für den Zugriff auf die Widget-Instanz. -
dir für den Zugriff auf die Handler-Attributliste.
Es gibt Optionen für
-
wählen Sie aus, wann das Widget aktiv sein soll,
-
den Modus einstellen, bevor der Befehl ausgeführt wird.
Beispiel für einen Befehl, um einfach eine Nachricht auf dem Terminal zu auszugeben:
print('Aktion aktiviert')
Beispiel für einen Befehl, um die Maschine in den Aus-Zustand zu versetzen:
CMD.state(linuxcnc.STATE_OFF)
Beispiel für einen Befehl für den Aufruf einer Handler-Funktion, die Daten übergibt:
EXT.on_button_press(self, 100)
You can use a semicolon to separate multiple commands;
print('Set Machine Off');CMD.state(linuxcnc.STATE_OFF)
More information on INFO and ACTION can be found here: GladeVCP Libraries modules.
More information on GStat can be found here: GStat.
7.3. VCP ToggleAction-Widgets
These are bi-modal widgets. They implement two actions or use a second (usually pressed
) state to indicate that currently an action is running. Toggle actions are aimed for use in ToggleButtons
, ToggleToolButtons
or toggling menu items. A simplex example is the ESTOP
toggle button.
Derzeit sind die folgenden Widgets verfügbar:
-
The
ESTOP
toggle sendsESTOP
orESTOP_RESET
commands to LinuxCNC depending on its state. -
Die Umschaltfunktion
ON/OFF
sendet die BefehleSTATE_ON
undSTATE_OFF
. -
Pause/Fortsetzen
sendet die BefehleAUTO_PAUSE
oderAUTO_RESUME
.
Die folgenden Toggle-Aktionen haben nur einen zugehörigen Befehl und verwenden den Zustand "gedrückt", um anzuzeigen, dass der angeforderte Vorgang ausgeführt wird:
-
Der
Run
-Toggle sendet einenAUTO_RUN
-Befehl und wartet imgedrückten
Zustand, bis der Interpreter wieder im Leerlauf ist. -
Der
Stop
-Schalter ist inaktiv, bis der Interpreter in den aktiven Zustand übergeht (d.h. G-Code ausführt) und dem Benutzer dann erlaubt, den BefehlAUTO_ABORT
zu senden. -
Der
MDI
-Umschalter sendet einen bestimmten MDI-Befehl und wartet im inaktiven Zustand "gedrückt" auf dessen Ausführung.
7.4. Die Action_MDI Toggle und Action_MDI Widgets
Diese Widgets bieten eine Möglichkeit, beliebige MDI-Befehle auszuführen.
Das Action_MDI
-Widget wartet nicht auf die Beendigung des Befehls, wie es das Action_MDI
-Toggle tut, das deaktiviert bleibt, bis der Befehl beendet ist.
7.5. Ein einfaches Beispiel: Ausführen eines MDI-Befehls bei Button-Druck
configs/apps/gladevcp/mdi-command-example/whoareyou.ui
ist eine Glade UI-Datei, welche die Grundlagen vermittelt:
-
Open it in Glade and study how it is done.
-
Starten Sie AXIS, und starten Sie es dann von einem Terminalfenster aus mit
gladevcp whoareyou.ui
. -
See the
hal_action_mdi1
action and itsMDI command
property - this just executes(MSG, "Hi, I'm an VCP_Action_MDI")
so there should be a message popup in AXIS like so:
Sie werden feststellen, dass die mit der Aktion Action_MDI verbundene Schaltfläche ausgegraut ist, wenn die Maschine ausgeschaltet ist, sich im E-Stop befindet oder der Interpreter läuft. Sie wird automatisch aktiv, wenn die Maschine eingeschaltet ist und sich nicht mehr im Notaus-Modus befindet und das Programm im Leerlauf ist.
7.6. Parameterübergabe mit Action_MDI- und ToggleAction_MDI-Widgets
Optional können bei "MDI Befehl"-Zeichenketten Parameter ersetzt werden, bevor sie an den Interpreter übergeben werden. Parameter können derzeit Namen von HAL-Pins in der GladeVCP-Komponente sein. So funktioniert es:
-
assume you have a HAL SpinBox named
speed
, and you want to pass its current value as a parameter in an MDI command. -
Die HAL SpinBox hat einen HAL-Pin vom Typ float mit dem Namen speed-f (siehe HalWidgets-Beschreibung).
-
-
für die obige HAL SpinBox könnten wir
(MSG, "Die Geschwindigkeit ist: ${geschwindigkeit-f}")
verwenden, um zu zeigen, was passiert.
Die Beispiel-UI-Datei ist "configs/apps/gladevcp/mdi-command-example/speed.ui". So sieht das Ergebnis aus, wenn man sie ausführt:
7.7. Ein fortgeschrittenes Beispiel: Übergabe von Parametern an eine O-Wort-Unterroutine
Es ist völlig in Ordnung, eine O-Wort-Unterroutine in einem MDI-Befehl aufzurufen und HAL-Pin-Werte als aktuelle Parameter zu übergeben. Eine Beispiel-UI-Datei befindet sich in configs/apps/gladevcp/mdi-command-example/owordsub.ui
.
Legen Sie nc_files/gladevcp_lib/oword.ngc
so ab, dass AXIS es finden kann, und führen Sie gladevcp owordsub.ui
in einem Terminalfenster aus. Das sieht dann so aus:
7.8. Vorbereitung einer MDI-Aktion und anschließendes Aufräumen
The LinuxCNC G-code interpreter has a single global set of variables, like feed, spindle speed, relative/absolute mode and others. If you use G-code commands or O-word subs, some of these variables might get changed by the command or subroutine - for example, a probing subroutine will very likely set the feed value quite low. With no further precautions, your previous feed setting will be overwritten by the probing subroutine’s value.
To deal with this surprising and undesirable side effect of a given O-word subroutine or G-code statement executed with an LinuxCNC ToggleAction_MDI, you might associate pre-MDI and post-MDI handlers with a given LinuxCNC ToggleAction_MDI. These handlers are optional and provide a way to save any state before executing the MDI Action, and to restore it to previous values afterwards. The signal names are mdi-command-start
and mdi-command-stop
; the handler names can be set in Glade like any other handler.
Here’s an example how a feed value might be saved and restored by such handlers (note that LinuxCNC command and status channels are available as self.linuxcnc
and self.stat
through the VCP_ActionBase class):
def on_mdi_command_start(self, action, userdata=None): action.stat.poll() self.start_feed = action.stat.settings[1] def on_mdi_command_stop(self, action, userdata=None): action.linuxcnc.mdi('F%.1f' % (self.start_feed)) while action.linuxcnc.wait_complete() == -1: pass
Nur das Toggle-Widget Action_MDI
unterstützt diese Signale.
Anmerkung
|
In einer späteren Version von LinuxCNC, werden die neuen M-Codes M70-M72 verfügbar sein. Sie machen das Speichern von Zustand vor einem Unterprogramm aufrufen, und Wiederherstellen von Zustand bei der Rückkehr viel einfacher. |
7.9. Verwendung des LinuxCNC Stat-Objekts zum Umgang mit Statusänderungen
Many actions depend on LinuxCNC status - is it in manual, MDI or auto mode? Is a program running, paused or idle? You cannot start an MDI command while a G-code program is running, so this needs to be taken care of. Many LinuxCNC actions take care of this themselves, and related buttons and menu entries are deactivated when the operation is currently impossible.
When using Python event handlers - which are at a lower level than Actions - one needs to take care of dealing with status dependencies oneself. For this purpose, there’s the LinuxCNC Stat widget: to associate LinuxCNC status changes with event handlers.
LinuxCNC Stat has no visible component - you just add it to your UI with Glade. Once added, you can associate handlers with its following signals:
-
zustandsbezogen:
-
state-estop
: ausgegeben, wenn die Notaus-Bedingung eintritt, -
state-estop-reset
: ausgegeben, wenn die Maschine zurückgesetzt wird, -
"state-on": wird beim Einschalten des Geräts ausgegeben,
-
state-off
: wird ausgegeben, wenn die Maschine ausgeschaltet wird.
-
-
Modus-bezogen:
-
mode-manual: wird ausgegeben, wenn LinuxCNC in den manuellen Modus wechselt,
-
mode-mdi
: ausgegeben, wenn LinuxCNC in den MDI-Modus wechselt, -
mode-auto
: ausgegeben, wenn LinuxCNC in den automatischen Modus wechselt,
-
-
Interpreter-bezogen: wird ausgegeben, wenn der G-Code-Interpreter in diesen Modus wechselt
-
interp-run
-
interp-idle
-
interp-paused
-
interp-reading
-
interp-waiting
-
file-loaded
-
line-changed
-
-
Referenzfart-bezogen: ausgegeben, wenn LinuxCNC referenziert ist oder nicht
-
all-homed
-
nicht-all-homed
-
8. GladeVCP-Programmierung
8.1. Benutzerdefinierte Aktionen
Most widget sets, and their associated user interface editors, support the concept of callbacks, i.e. functions in user-written code which are executed when something happens in the UI - events like mouse clicks, characters typed, mouse movement, timer events, window hiding and exposure and so forth.
HAL output widgets typically map input-type events like a button press to a value change of the associated HAL pin by means of such a - predefined - callback. Within PyVCP, this is really the only type of event handling supported - doing something more complex, like executing MDI commands to call a G-code subroutine, is not supported.
Within GladeVCP, HAL pin changes are just one type of the general class of events (called signals) in GTK+. Most widgets may originate such signals, and the Glade editor supports associating such a signal with a Python method or function name.
If you decide to use user-defined actions, your job is to write a Python module whose class methods - or in the simple case, just functions - can be referred to in Glade as event handlers. GladeVCP provides a way to import your module(s) at startup and will automatically link your event handlers with the widget signals as set in the Glade UI description.
8.2. Core-Bibliothek
Es gibt drei Bibliotheken mit Funktionen, die zur Programmierung von GladeVCP verwendet werden können.
-
Info: sammelt Details aus der INI-Datei.
-
Action: Eine Sammlung von Funktionen zum Ändern von LinuxCNC-Zuständen.
-
Status: Meldet den Status von LinuxCNC. Es führt intern "Gstat" aus ("wrapt").
Importieren und Instanziieren der Bibliotheken:
from gladevcp.core import Info, Action ACTION = Action() INFO = Info()
Using the library functions:
print(INFO.MACHINE_IS_METRIC) ACTION.SET_ERROR_MESSAGE('Something went wrong')
More information can be found here: GladeVCP Libraries modules. There is a sample configuration that demonstrates using the core library with GladeVCP’s action Python widgets and with a Python handler file. Try loading sim/axis/gladevcp/gladevcp_panel_tester.
8.3. Ein Beispiel: Hinzufügen benutzerdefinierter Callback-Funktionen in Python
Dies ist nur ein minimales Beispiel, um die Idee zu vermitteln - Details werden im restlichen Teil dieses Abschnitts erläutert.
GladeVCP can not only manipulate or display HAL pins, you can also write regular event handlers in Python. This could be used, among others, to execute MDI commands. Here’s how you do it:
Schreiben Sie ein Python-Modul wie folgt und speichern Sie es z. B. als handlers.py:
nhits = 0 def on_button_press(gtkobj,data=None): global nhits nhits += 1 gtkobj.set_label("hits: %d" % nhits)
In Glade, define a button or HAL button, select the Signals tab, and in the GtkButton properties select the pressed line. Enter on_button_press there, and save the Glade file.
Then add the option -u handlers.py to the GladeVCP command line. If your event handlers are spread over several files, just add multiple -u <pyfilename> options.
Now, pressing the button should change its label since it is set in the callback function.
What the +-u+
flag does: all Python functions in this file are collected and setup as potential callback handlers for your Gtk widgets - they can be referenced from Glade Signals tabs. The callback handlers are called with the particular object instance as parameter, like the GtkButton instance above, so you can apply any GtkButton method from there.
Oder machen Sie etwas Nützlicheres, wie den Aufruf eines MDI-Befehls!
8.4. HAL-Wertänderungs-Ereignisse
HAL-Eingangs-Widgets, wie z.B. eine LED, assoziieren automatisch ihren HAL-Pin-Status (an/aus) mit dem optischen Erscheinungsbild des Widgets (LED leuchtet/dunkelt).
Beyond this built-in functionality, one may associate a change callback with any HAL pin, including those of predefined HAL widgets. This fits nicely with the event-driven structure of a typical widget application: Every activity, be it mouse click, key, timer expired, or the change of a HAL pin’s value, generates a callback and is handled by the same orthogonal mechanism.
Für benutzerdefinierte HAL-Pins, die nicht mit einem bestimmten HAL-Widget verbunden sind, lautet der Signalname value-changed. Siehe den Abschnitt AL Pins hinzufügen weiter unten für Details.
HAL Widgets werden mit einem vordefinierten Signal namens hal-pin-changed geliefert. Siehe den Abschnitt HAL Widgets für Details.
8.5. Programmiermodell
Das Gesamtkonzept sieht folgendermaßen aus:
-
Entwerfen Sie Ihre Benutzeroberfläche mit Glade, und legen Sie Signal-Handler fest, wenn Sie Aktionen mit einem Widget verbinden möchten.
-
Schreiben Sie ein Python-Modul, das aufrufbare Objekte enthält (siehe "Handler-Modelle" unten).
-
Übergeben Sie den Pfadnamen Ihres Moduls an GladeVCP mit der Option -u <modul>.
-
GladeVCP importiert das Modul, prüft es auf Signalhandler und verbindet sie mit dem Widgetbaum.
-
Die Hauptereignisschleife wird ausgeführt.
8.5.1. Das einfache Handler-Modell
For simple tasks it is sufficient to define functions named after the Glade signal handlers. These will be called when the corresponding event happens in the widget tree. Here’s a trivial example - it assumes that the pressed signal of a Gtk Button or HAL Button is linked to a callback called on_button_press:
nhits = 0 def on_button_press(gtkobj,data=None): global nhits nhits += 1 gtkobj.set_label("hits: %d" % nhits)
Fügen Sie diese Funktion in eine Python-Datei ein und führen Sie sie wie folgt aus:
gladevcp -u <myhandler>.py mygui.ui
Beachten Sie, dass die Kommunikation zwischen Handlern über globale Variablen erfolgen muss, was nicht gut skalierbar und absolut unpythonisch ist. Aus diesem Grund haben wir das klassenbasierte Handler-Modell entwickelt.
8.5.2. Das klassenbasierte Handler-Modell
The idea here is: Handlers are linked to class methods. The underlying class(es) are instantiated and inspected during GladeVCP startup and linked to the widget tree as signal handlers. So the task now is to write:
-
One or more several class definition(s) with one or several methods, in one module or split over several modules,
-
a function get_handlers in each module which will return a list of class instances to GladeVCP - their method names will be linked to signal handlers.
Hier ist ein minimales benutzerdefiniertes Handler-Beispielmodul:
class MyCallbacks : def on_this_signal(self,obj,data=None): print("this_signal happened, obj=",obj) def get_handlers(halcomp,builder,useropts): return [MyCallbacks ()]
Jetzt wird on_this_signal als Signalhandler für Ihren Widgetbaum verfügbar sein.
8.5.3. GladeVCP-spezifische Signale
For GladeVCP panel which respond to HAL inputs it may be important that the handler code can tell that the GladeVCP panel is currently active and displayed. For example a panel inside the Touchy interface might well need to perform an action when the switch connected to touchy.cycle-start is operated (in the same way that the native tabs respond differently to the same button).
To make this possible, a signal is sent from the GUI (at the time of writing, only Touchy) to the embedded tab. The signal is of type "Gladevcp" and the two messages sent are "Visible" and "Hidden". (Note that the signals have a fixed length of 20 characters so only the first characters should be used in any comparison, hence the [:7] below.) A sample handler for these signals is:
# This catches our messages from another program def event(self,w,event): print(event.message_type,event.data) if event.message_type == 'Gladevcp': if event.data[:7] == 'Visible': self.active = True else: self.active = False # connect to client-events from the host GUI def on_map_event(self, widget, data=None): top = widget.get_toplevel() print("map event") top.connect('client-event', self.event)
8.5.4. Das get_handlers Protokoll
Wenn GladeVCP bei der Modulinspektion eine Funktion get_handlers
findet, ruft es diese wie folgt auf:
get_handlers(halcomp,builder,useropts)
Die Argumente sind:
-
halcomp
- refers to the HAL component under construction, -
builder
- widget tree - result of reading the UI definition (either referring to a GtkBuilder or libglade-type object), -
useropts
- eine Liste von Zeichenfolgen, die von der GladeVCP-Befehlszeile mit der Option -U <useropts> gesammelt werden.
GladeVCP then inspects the list of class instances and retrieves their method names. Qualifying method names are connected to the widget tree as signal handlers. Only method names which do not begin with an _ (underscore) are considered.
Note that regardless whether you’re using the libglade or the new GtkBuilder format for your Glade UI, widgets can always be referred to as builder.get_object(<widgetname>)
. Also, the complete list of widgets is available as builder.get_objects()
regardless of UI format.
8.6. Initialisierungssequenz
Es ist wichtig zu wissen, in welchem Zustand die Funktion get_handlers()
aufgerufen wird, damit Sie wissen, was Sie dort sicher tun können und was nicht. Zunächst werden die Module in der Befehlszeilenreihenfolge importiert und initialisiert. Nach erfolgreichem Import wird get_handlers()
im folgenden Zustand aufgerufen:
-
Der Widgetbaum ist erstellt, aber noch nicht realisiert (es wurde noch kein Toplevel
window.show()
ausgeführt). -
The halcomp HAL component is set up and all HAL widgets' pins have already been added to it.
-
Es ist sicher, weitere HAL-Pins hinzuzufügen, da halcomp.ready() zu diesem Zeitpunkt noch nicht aufgerufen wurde, so dass Sie Ihre eigenen Pins hinzufügen können, zum Beispiel in der Klasse init()-Methode.
Nachdem alle Module importiert und die Methodennamen extrahiert wurden, werden die folgenden Schritte durchgeführt:
-
Alle qualifizierenden Methodennamen werden mit connect_signals()/signal_autoconnect() mit dem Widget-Baum verbunden (abhängig von der Art der importierten Benutzeroberfläche - GtkBuilder im Vergleich zum alten libglade-Format).
-
Die HAL-Komponente wird mit halcomp.ready() abgeschlossen.
-
Wenn eine Fenster-ID als Argument übergeben wurde, wird der Widget-Baum neu geparented, um in diesem Fenster zu laufen, und Glades Toplevel window1 wird aufgegeben (siehe FAQ).
-
Wenn eine HAL-Befehlsdatei mit
-H halfile
übergeben wurde, wird sie mit halcmd ausgeführt. -
Die Gtk-Hauptschleife wird ausgeführt.
So when your handler class is initialized, all widgets are existent but not yet realized (displayed on screen). And the HAL component isn’t ready as well, so its unsafe to access pins values in your __init__()
method.
If you want to have a callback to execute at program start after it is safe to access HAL pins, then a connect a handler to the realize signal of the top level window1 (which might be its only real purpose). At this point GladeVCP is done with all setup tasks, the HAL file has been run, and GladeVCP is about to enter the Gtk main loop.
8.7. Mehrere Callbacks mit demselben Namen
Within a class, method names must be unique. However, it is OK to have multiple class instances passed to GladeVCP by get_handlers() with identically named methods. When the corresponding signal occurs, these methods will be called in definition order - module by module, and within a module, in the order class instances are returned by get_handlers()
.
8.8. Die GladeVCP -U <useropts>
Flag
Instead of extending GladeVCP for any conceivable option which could potentially be useful for a handler class, you may use the -U <useroption> flag (repeatedly if you wish). This flag collects a list of <useroption> strings. This list is passed to the get_handlers() function (useropts argument). Your code is free to interpret these strings as you see fit. An possible usage would be to pass them to the Python exec function in your get_handlers()
as follows:
debug = 0 ... def get_handlers(halcomp,builder,useropts): ... global debug # assuming there's a global var for cmd in useropts: exec cmd in globals()
Auf diese Weise können Sie beliebige Python-Anweisungen an Ihr Modul übergeben, zum Beispiel durch die Option gladevcp -U
:
gladevcp -U debug=42 -U "print 'debug=%d' % debug" ...
Dies sollte debug auf 2 setzen und bestätigen, dass Ihr Modul es tatsächlich getan hat.
8.9. Persistente Variablen in GladeVCP
An annoying aspect of GladeVCP in its earlier form and PyVCP is the fact that you may change values and HAL pins through text entry, sliders, spin boxes, toggle buttons, etc., but their settings are not saved and restored at the next run of LinuxCNC - they start at the default value as set in the panel or widget definition.
GladeVCP verfügt über einen einfach zu bedienenden Mechanismus zum Speichern und Wiederherstellen des Zustands von HAL-Widgets und Programmvariablen (in der Tat jedes Instanzattribut vom Typ int, float, bool oder string).
Dieser Mechanismus verwendet das weit verbreitete INI-Dateiformat, um dauerhafte Attribute zu speichern und wieder zu laden.
Imagine renaming, adding or deleting widgets in Glade: An .INI file lying around from a previous program version, or an entirely different user interface, would be not be able to restore the state properly since variables and types might have changed.
GladeVCP detects this situation by a signature which depends on all object names and types which are saved and to be restored. In the case of signature mismatch, a new INI file with default settings is generated.
8.10. Verwendung persistenter Variablen
Wenn Sie möchten, dass der Status des Gtk-Widgets, die Werte des HAL-Widgets-Ausgabepins und/oder die Klassenattribute Ihrer Handler-Klasse über Aufrufe hinweg erhalten bleiben, gehen Sie wie folgt vor:
-
Importieren Sie das Modul gladevcp.persistence.
-
Entscheiden Sie, welche Instanzattribute und deren Standardwerte Sie beibehalten wollen, falls vorhanden.
-
Entscheiden Sie, welche Widgets ihren Zustand beibehalten sollen.
-
Describe these decisions in your handler class'
\__init()__
method through a nested dictionary as follows:
def __init__(self, halcomp,builder,useropts): self.halcomp = halcomp self.builder = builder self.useropts = useropts self.defaults = { # die folgenden Namen werden als Methodenattribute gespeichert/wiederhergestellt # Der Mechanismus zum Speichern/Wiederherstellen ist stark typisiert - der Typ der Variablen wird vom Typ des # Initialisierungswertes abgeleitet. Derzeit unterstützte Typen sind: int, float, bool, string IniFile.vars : { 'nhits' : 0, 'a': 1.67, 'd': True ,'c' : "ein String"}, # zum Speichern/Wiederherstellen aller Widgets, die auch nur im Entferntesten Sinn machen könnten, fügen Sie dies hinzu: IniFile.widgets : widget_defaults(builder.get_objects()) # Eine sinnvolle Alternative wäre es, nur den Zustand aller HAL-Ausgabe-Widgets beizubehalten: # IniFile.widgets: widget_defaults(select_widgets(self.builder.get_objects(), hal_only=True,output_only = True)), }
Dann verknüpfen Sie eine INI-Datei mit diesem Deskriptor:
self.ini_filename = __name__ + '.ini' self.ini = IniFile(self.ini_filename,self.defaults,self.builder) self.ini.restore_state(self)
Nach restore_state()
werden die Attribute von self gesetzt, wenn sie wie folgt ablaufen:
self.nhits = 0 self.a = 1.67 self.d = True self.c = "eine Zeichenkette"
Note that types are saved and preserved on restore. This example assumes that the INI file didn’t exist or had the default values from self.defaults.
Nach dieser Beschwörung können Sie die folgenden IniFile-Methoden verwenden:
- ini.save_state(obj)
-
Speichert die Attribute von objs gemäß dem
IniFile.vars
-Wörterbuch und den Zustand des Widgets wie inIniFile.widgets
beschrieben inself.defaults
. - ini.create_default_ini()
-
Erstellen Sie eine INI-Datei mit Standardwerten.
- ini.restore_state(obj)
-
HAL out Pins und obj’s Attribute wie oben gespeichert/initialisiert auf Standard zurücksetzen.
8.11. Speichern des Status beim Herunterfahren von GladeVCP
Um den Zustand des Widgets und/oder der Variablen beim Beenden zu speichern, gehen Sie wie folgt vor:
-
Wählen Sie ein Interieur-Widget aus (Typ ist nicht wichtig, z. B. eine Tabelle).
-
Wählen Sie auf der Registerkarte "Signale" die Option "GtkObject". In der ersten Spalte sollte ein destroy-Signal angezeigt werden.
-
Add the handler name, e.g. on_destroy, to the second column.
-
Fügen Sie einen Python-Handler wie unten beschrieben hinzu:
import gtk ... def on_destroy(self,obj,data=None): self.ini.save_state(self)
Dadurch wird der Status gespeichert und GladeVCP ordnungsgemäß heruntergefahren, unabhängig davon, ob das Panel in AXIS eingebettet oder ein eigenständiges Fenster ist.
Achtung
|
Do not use |
Wenn Sie die GladeVCP-Anwendung das nächste Mal starten, sollten die Widgets in dem Zustand angezeigt werden, in dem sie beim Schließen der Anwendung waren.
Achtung
|
Die GtkWidget-Zeile hat ein ähnlich klingendes destroy-event - nicht verwenden, um sich mit dem on_destroy-Handler zu verbinden, es wird nicht funktionieren - stellen Sie sicher, dass Sie das destroy-Ereignis aus der GtkObject-Zeile verwenden. |
8.12. Status speichern, wenn Strg-C gedrückt wird
By default, the reaction of GladeVCP to a Ctrl-C event is to just exit - without saving state. To make sure that this case is covered, add a handler call on_unix_signal
which will be automatically be called on Ctrl-C (actually on the SIGINT and SIGTERM signals). Example:
def on_unix_signal(self,signum,stack_frame): print("on_unix_signal(): signal %d received, saving state" % (signum)) self.ini.save_state(self)
8.13. Manuelle Bearbeitung von INI-Dateien (.ini)
You can do that, but note that the values in self.defaults override your edits if there is a syntax or type error in your edit. The error is detected, a console message will hint about that happened, and the bad inifile will be renamed to have the .BAD suffix. Subsequent bad INI files overwrite earlier .BAD files.
8.14. Hinzufügen von HAL-Pins
Wenn Sie HAL-Pins benötigen, die nicht mit einem bestimmten HAL-Widget verbunden sind, fügen Sie sie wie folgt hinzu:
import hal_glib ... # in your handler class __init__(): self.example_trigger = hal_glib.GPin(halcomp.newpin('example-trigger', hal.HAL_BIT, hal.HAL_IN))
To get a callback when this pin’s value changes, associate a value-change
callback with this pin, add:
self.example_trigger.connect('value-changed', self._on_example_trigger_change)
and define a callback method (or function, in this case leave out the self
parameter):
# Hinweis: '_' - diese Methode ist für den Widget-Baum nicht sichtbar. def _on_example_trigger_change(self,pin,userdata=None): print("Pin-Wert geändert in:" % (pin.get()))
8.15. Hinzufügen von Timern
Since GladeVCP uses Gtk widgets which rely on the PyGObject base class, the full GLib functionally is available. Here is an example for a timer callback:
def _on_timer_tick(self,userdata=None): ... return True # to restart the timer; return False for on-shot ... # demonstrate a slow background timer - granularity is one second # for a faster timer (granularity 100 ms), use this: # GLib.timeout_add(100, self._on_timer_tick,userdata) # 10Hz GLib.timeout_add_seconds(1, self._on_timer_tick)
8.16. HAL-Widget-Eigenschaften programmatisch einstellen
With Glade, widget properties are typically set fixed while editing. You can, however, set widget properties at runtime, for instance from INI file values, which would typically be done in the handler initialization code. Setting properties from HAL pin values is possible, too.
Im folgenden Beispiel (unter der Annahme eines HAL Meter-Widgets mit dem Namen meter
) wird der Minimalwert des Zählers beim Start über einen INI-Dateiparameter und der Maximalwert über einen HAL-Pin eingestellt, wodurch die Skala des Widgets dynamisch angepasst wird:
import linuxcnc import os import hal import hal_glib class HandlerClass: def _on_max_value_change(self,hal_pin,data=None): self.meter.max = float(hal_pin.get()) self.meter.queue_draw() # force a widget redraw def __init__(self, halcomp,builder,useropts): self.builder = builder # HAL-Pin mit Änderungs-Callback. # Wenn sich der Wert des Pins ändert, wird der Callback ausgeführt. self.max_value = hal_glib.GPin(halcomp.newpin('max-value', hal.HAL_FLOAT, hal.HAL_IN)) self.max_value.connect('value-changed', self._on_max_value_change) inifile = linuxcnc.ini(os.getenv("INI_FILE_NAME")) mmin = float(inifile.find("METER", "MIN") or 0.0) self.meter = self.builder.get_object('meter') self.meter.min = mmin def get_handlers(halcomp,builder,useropts): return [HandlerClass(halcomp,builder,useropts)]
8.17. Value-changed callback with hal_glib
GladeVCP nutzt die hal_glib-Bibliothek, die dazu verwendet werden kann, ein "watcher" Signal an einen HAL-Eingangspin anzuschließen.
Dieses Signal kann verwendet werden, um eine Funktion zu registrieren, die aufgerufen wird, wenn sich der Zustand des HAL-Pins ändert.
One must import the hal_glib
and the hal
modules:
import hal_glib import hal
Erstellen Sie dann einen Pin und verbinden Sie ein value-changed Signal (den Watcher) mit einem Funktionsaufruf:
class HandlerClass: def __init__(self, halcomp,builder,useropts): self.example_trigger = hal_glib.GPin(halcomp.newpin('example-trigger', hal.HAL_BIT, hal.HAL_IN)) self.example_trigger.connect('value-changed', self._on_example_trigger_change)
Und eine Funktion haben, die aufgerufen werden soll:
def _on_example_trigger_change(self,pin,userdata=None): print("pin value changed to: {}".format(pin.get())) print("pin name= {}".format(pin.get_name())) print("pin type= {}".format(pin.get_type())) # dies kann außerhalb der Funktion aufgerufen werden self.example_trigger.get()
8.18. Beispiele und die Entwicklung Ihrer eigenen GladeVCP-Anwendung
Visit linuxcnc_root_directory/configs/apps/gladevcp
for running examples and starters for your own projects.
9. FAQ
-
Ich erhalte ein unerwartetes Unmap-Ereignis in meiner Handler-Funktion direkt nach dem Start. Was ist das?
This is a consequence of your Glade UI file having the window1 Visible property set to True, together with re-parenting the GladeVCP window into AXIS or touchy. The GladeVCP widget tree is created, including a top level window, and then reparented into AXIS, leaving that toplevel window laying around orphaned. To avoid having this useless empty window hanging around, it is unmapped (made invisible), which is the cause of the unmap signal you get. Suggested fix: set window1.visible to False, and ignore an initial unmap event.
-
Mein GladeVCP-Programm startet, aber es erscheint kein Fenster dort, wo ich es erwarte?
The window AXIS allocates for GladeVCP will obtain the natural size of all its child widgets combined. It is the child widget’s job to request a size (width and/or height). However, not all widgets do request a width greater than 0, for instance the Graph widget in its current form. If there’s such a widget in your Glade file and it is the one which defines the layout you might want to set its width explicitly. Note that setting the window1 width and height properties in Glade does not make sense because this window will be orphaned during re-parenting and hence its geometry will have no impact on layout (see above). The general rule is: if you manually run a UI file with gladevcp <uifile> and its window has reasonable geometry, it should come up in AXIS properly as well.
-
Ich möchte eine blinkende LED, aber sie blinkt nicht
I ticked the checkbutton to let it blink with 100 msec interval. It wont blink, and I get a startup warning: Warning: value "0" of type ‚gint‘ is invalid or out of range for property ‚led-blink-rate‘ of type ‚gint‘? This seems to be a Glade bug. Just type over the blink rate field, and save again - this works for me.
-
Mein GladeVCP-Panel in AXIS speichert den Status nicht, wenn ich AXIS schließe, obwohl ich einen on_destroy-Handler definiert habe, der mit dem Fensterzerstörungssignal verbunden ist
Very likely this handler is linked to window1, which due to reparenting isn’t usable for this purpose. Please link the on_destroy handler to the destroy signal of an interior window. For instance, I have a notebook inside window1, and linked on_destroy to the notebooks destroy signal, and that works fine. It doesn’t work for window1.
-
Ich möchte die Hintergrundfarbe oder den Text eines HAL_Label-Widgets abhängig von seinem HAL-Pin-Wert einstellen
See the example in configs/apps/gladevcp/colored-label. Setting the background color of a GtkLabel widget (and HAL_Label is derived from GtkLabel) is a bit tricky. The GtkLabel widget has no window object of its own for performance reasons, and only window objects can have a background color. The solution is to enclose the Label in an EventBox container, which has a window but is otherwise invisible - see the coloredlabel.ui file.
-
Ich habe ein "hal_spinbutton"-Widget in Glade definiert und eine Standard-Eigenschaft
value
in der entsprechenden Einstellung festgelegt. Wieso zeigt es Null? -
This is due to a bug in the old Gtk version distributed with Ubuntu 8.04 and 10.04, and is likely to be the case for all widgets using adjustment. The workaround mentioned for instance in http://osdir.com/ml/gtk-app-devel-list/2010-04/msg00129.html does not reliably set the HAL pin value, it is better to set it explicitly in an
on_realize
signal handler during widget creation. See the example inconfigs/apps/gladevcp/by-widget/spinbutton.{ui,py}
.
10. Fehlersuche
-
Make sure you have the development version of LinuxCNC installed. You don’t need the axisrc file any more, this was mentioned in the old GladeVCP wiki page.
-
Run GladeVCP or AXIS from a terminal window. If you get Python errors, check whether there’s still a
/usr/lib/python2.6/dist-packages/hal.so
file lying around besides the newer/usr/lib/python2.6/dist-packages/_hal.so
(note the underscore); if yes, remove thehal.so
file. It has been superseded by hal.py in the same directory and confuses the import mechanism. -
Wenn Sie run-in-place verwenden, führen Sie ein make clean aus, um alle versehentlich übrig gebliebenen hal.so-Dateien zu entfernen, und dann make.
-
If you’re using HAL_table or HAL_HBox widgets, be aware they have an HAL pin associated with it which is off by default. This pin controls whether these container’s children are active or not.
11. Implementierungshinweis: Schlüsselbehandlung in AXIS
We believe key handling works OK, but since it is new code, we’re telling about it you so you can watch out for problems; please let us know of errors or odd behavior. This is the story:
AXIS uses the TkInter widget set. GladeVCP applications use Gtk widgets and run in a separate process context. They are hooked into AXIS with the Xembed protocol. This allows a child application like GladeVCP to properly fit in a parent’s window, and - in theory - have integrated event handling.
However, this assumes that both parent and child application properly support the Xembed protocol, which Gtk does, but TkInter does not. A consequence of this is that certain keys would not be forwarded from a GladeVCP panel to AXIS properly under all circumstances. One of these situations was the case when an Entry, or SpinButton widget had focus: In this case, for instance an Escape key would not have been forwarded to AXIS and cause an abort as it should, with potentially disastrous consequences.
Therefore, key events in GladeVCP are explicitly handled, and selectively forwarded to AXIS, to assure that such situations cannot arise. For details, see the keyboard_forward()
function in lib/python/gladevcp/xembed.py
.
12. Hinzufügen von benutzerdefinierten Widgets
The LinuxCNC Wiki has information on adding custom widgets to GladeVCP. GladeVCP Custom Widgets
13. GladeVCP-Hilfsanwendungen
Es werden unabhängig installierte GladeVCP-Anwendungen unterstützt, die mit der Platzierung des Systemverzeichnisses übereinstimmen, wie sie von den LINUXCNC_AUX_GLADEVCP- und LINUXCNC_AUX_EXAMPLES-Elementen definiert wird, die vom Skript linuxcnc_var gemeldet werden:
$ linuxcnc_var LINUXCNC_AUX_GLADEVCP
/usr/share/linuxcnc/aux_gladevcp
$ linuxcnc_var LINUXCNC_AUX_EXAMPLES
/usr/share/linuxcnc/aux_examples
Das durch LINUXCNC_AUX_GLADEVCP definierte Systemverzeichnis (/usr/share/linuxcnc/aux_gladevcp) gibt den Speicherort für eine GladeVCP-kompatible Python-Datei(en) und zugehörige Unterverzeichnisse an. Die Python-Datei wird beim Start von GladeVCP importiert und für nachfolgende GladeVCP-Anwendungen verfügbar gemacht, einschließlich der eingebetteten Verwendung in unterstützenden GUIs.
Das durch LINUXCNC_AUX_EXAMPLES definierte Systemverzeichnis (/usr/share/linuxcnc/aux_examples) gibt den Speicherort von Beispielkonfigurations-Unterverzeichnissen an, die für Hilfsanwendungen verwendet werden. Siehe den Abschnitt getting-started/running-linuxcnc für Hinzufügen von Konfigurationsauswahlen.
For testing, a runtime specification of auxiliary applications may be specified using the exported environmental variable: GLADEVCP_EXTRAS. This variable should be a path list of one or more configuration directories separated by a (:). Typically, this variable would be set in a shell starting linuxcnc
or in a user’s ~/.profile
startup script. Example:
export GLADEVCP_EXTRAS=~/mygladevcp:/opt/othergladevcp
Dateien, die in Verzeichnissen gefunden werden, die mit der Umgebungsvariablen GLADEVCP_EXTRAS angegeben sind, ersetzen gleichnamige Dateien in Unterverzeichnissen des durch LINUXNC_AUX_GLADEVCP angegebenen Systemverzeichnisses (z. B. /usr/share/linuxcnc/aux_gladevcp). Diese Bestimmung ermöglicht es einem Entwickler, eine Anwendung zu testen, indem er GLADEVCP_EXTRAS exportiert, um ein privates Anwendungsverzeichnis anzugeben, ohne ein im System installiertes Anwendungsverzeichnis zu entfernen. Meldungen über abgelehnte Duplikate werden auf stdout ausgegeben.
Anmerkung
|
Die Unterstützung für GladeVCP-Hilfsanwendungen erfordert ein Python-Modul namens importlib. Dieses Modul ist möglicherweise in älteren Installationen wie Ubuntu-Lucid nicht verfügbar. |