Describe the new page here. |
Gscreen borrows heavily from gladeVCP. GladeVCP? uses the GTK widget editor GLADE to build virtual control panels (VCP) by point and click. |
Gscreen borrows heavily from GladeVCP. GladeVCP uses the GTK widget editor GLADE to build virtual control panels (VCP) by point and click. |
Which is great right? As long as you like the screen I built it is - which has got to be right cause it's perfect :) Well ok you have a special machine and you want some buttons and status LEDs - no problem thats what gladeVCP is for and Gscreen supports it. But gladeVCP is restricted to positions on the screen that were made for embedding and you want the button on the left side damn it! hmmm well gladeVCP uses the GLADE editor to build the panels and so does Gscreen - so why don't we just use the editor to edit Gscreen? Well that is the first level of real customisation of Gscreen! So the first three you need to know something about is [GLADE] (the editor), [PyGTK] (the widget toolkit), and [gladeVCP] (linuxcnc's connection to GLADE/PyGTK?) You must know how to use the GLADE editor, PyGTK? is the widget toolkit so you need to know what the widgets are and can do, GladeVCP? has some special widgets added just for linuxcnc And if you were wondering a widget is just the generic name used for the buttons, sliders, labels etc of the PyGTK? toolkit. |
Which is great, right? As long as you like the screen I built it is - which has got to be right cause it's perfect :) Well, OK, you have a special machine and you want some buttons and status LEDs - no problem, that's what GladeVCP is for and Gscreen supports it. But GladeVCP is restricted to positions on the screen that were made for embedding, and you want the button on the left side, damn it! Hmmm, well, GladeVCP uses the GLADE editor to build the panels and so does Gscreen - so why don't we just use the editor to edit Gscreen? Well, that is the first level of real customisation of Gscreen! So the first three you need to know something about are [GLADE] (the editor), [PyGTK] (the widget toolkit), and [GladeVCP] (LinuxCNC's connection to GLADE/PyGTK) You must know how to use the GLADE editor, PyGTK is the widget toolkit so you need to know what the widgets are and can do, GladeVCP has some special widgets added just for LinuxCNC And if you were wondering, a widget is just the generic name used for the buttons, sliders, labels, etc. of the PyGTK toolkit. |
Hey didn't you read the link I showed you? |
Hey, didn't you read the link I showed you? |
PyGTK? uses this file to actually display and react to those widgets. |
PyGTK uses this file to actually display and react to those widgets. |
1.1. PyGTK? thats a funny namePyGTK? is the python binding to GTK - That clear it all up??? Ok GTK really is the one that display everything, it's programmed in a language called C. PyGTK? uses a language called Python to interact with GTK. Python is much easier/faster to work with then C 1.2. GladeVCP?GladeVCP? binds linuxcnc, HAL, PyGTK? and GLADE all together. Linuxcnc requires some special widgets so gladeVCP supplies them. Many are just HAL extensions to existing PyGTK? widgets GladeVCP? creates the HAL pins for the special widgets described in the GLADE file. GladeVCP? also allows one to add python commands to interact with the widgets, to make them do things not available in their default form If you can build a gladeVCP panel you can customise Gscreen |
Please see the gladevcp write-up about the basics to gladeVCP handler files - Gscreen uses a very similar technique |
Please see the GladeVCP write-up about the basics to GladeVCP handler files - Gscreen uses a very similar technique |
2. Hey I can build a gladeVCP panel! What about GscreenGscreen is just a really big complicated gladeVCP panel, with a bunch of python code to control it. |
4. Hey, I can build a GladeVCP panel! What about Gscreen?Gscreen is just a really big complicated GladeVCP panel, with a bunch of python code to control it. |
Use a compiled from source 'master' version of linuxcnc open a terminal and cd to the top of the linuxcnc folder |
Use a compiled from source 'master' version of LinuxCNC open a terminal and cd to the top of the LinuxCNC folder |
Ok you have loaded the stock glade file and now can edit it. the first thing you notice is it does not look in the editor like what it's displayed like |
OK, you have loaded the stock glade file and now can edit it. The first thing you notice is it does not look in the editor like what it's displayed as. |
When making changes it is far easier to add widgets then subtract widgets and still have the screen work properly making objects 'not visible' is one way to change the display without getting errors - this won't always work some widgets will be set visible again Changing the names of Gscreen's regular widgets is probably not gonna work well without python code - but moving a widget while keeping the name is usually workable |
When making changes it is far easier to add widgets then subtract widgets and still have the screen work properly. Making objects 'not visible' is one way to change the display without getting errors - this won't always work, some widgets will be set visible again. Changing the names of Gscreen's regular widgets will probably not work well without python code - but moving a widget while keeping the name is usually workable. |
Gscreen leverages gladeVCP widgets as much as possible, to avoid adding python code. Learning about gladeVCP widgets is a prerequisite. |
Gscreen leverages GladeVCP widgets as much as possible, to avoid adding python code. Learning about GladeVCP widgets is a prerequisite. |
Remember, if you use a custom screen option YOU are responsible for fixing it (if required) when updating linuxcnc. |
Remember, if you use a custom screen option YOU are responsible for fixing it (if required) when updating LinuxCNC. |
add all the ones you see on the top right. |
-Add all the ones you see on the top right. |
-the gremlin widget doesn't have a default size so setting a requested size is helpful.(see below) -The sourceview widget will try to use the whole window so adding it to a scrolled window will cover this.(This is already been done in the example) -The buttons will expand as the window is made larger which is ugly so we will set the box they are in, to not expand (see below) |
-The gremlin widget doesn't have a default size, so setting a requested size is helpful.(see below) -The sourceview widget will try to use the whole window, so adding it to a scrolled window will cover this. (This has already been done in the example). -The buttons will expand as the window is made larger, which is ugly, so we will set the box they are in to not expand (see below). |
In this screen we are using emc_actions to communicate to linuxcnc the actions we want. |
In this screen we are using emc_actions to communicate to LinuxCNC the actions we want. |
under the general tab you can change the text of the button's label to describe it's function. |
Under the general tab you can change the text of the button's label to describe it's function. |
select the gremlin widget click the common tab and set the requested height to 100 and click the checkbox beside it. |
Select the gremlin widget. Click the common tab, set the requested height to 100, and click the checkbox beside it. |
click the horizontal box that holds the buttons. click the packing tab and click 'expand' to 'No' |
Click the horizontal box that holds the buttons. Click the packing tab and click 'expand' to 'No' |
Ok that it - we need to save it as tester.glade and save it in sim/gscreen/gscreen_custom/ folder. now launch linuxcnc and click to sim/gscreen/gscreen_custom/tester and start it. If all goes well our screen will pop up and the buttons will do their job This works because the tester.ini tells gscreen to look for and load tester.glade and tester_handler.py |
OK, that's it - we need to save it as tester.glade and save it in sim/gscreen/gscreen_custom/ folder. Now launch LinuxCNC and click to sim/gscreen/gscreen_custom/tester and start it. If all goes well our screen will pop up and the buttons will do their job. This works because the tester.ini tells gscreen to look for and load tester.glade and tester_handler.py. |
Since the special widgets directly communicate with linuxcnc - you can still do useful things. |
Since the special widgets directly communicate with LinuxCNC - you can still do useful things. |
If you want something more there are still many tricks available from just adding 'function calls' to get canned behaviour, To coding your own python code to customize exactly what you want. But that means learning about handler files. |
If you want something more there are still many tricks available, from just adding 'function calls' to get canned behaviour, to coding your own python code to customize exactly what you want. But that means learning about handler files. |
Here is gaxis and it's handler file: |
Here is gaxis and its handler file: |
gscreen starts by reading the options it was started. It sets the debug mode and set the optional skin name. |
Gscreen starts by reading the options it was started with. It sets the debug mode and sets the optional skin name. |
optional Audio is initialized if available. |
Optional Audio is initialized if available. |
Gladevcp's makepins is called to parse the XML file to build HAL pins for the HAL widgets and register The linuxcnc connected widgets. |
GladeVCP's makepins is called to parse the XML file to build HAL pins for the HAL widgets and register the LinuxCNC connected widgets. |
If there is a handler file gscreen parses it, and registers the function calls into Gscreen's namespace. At this point Glade matches/registers all signal calls to functions in gscreen and the handler file. gscreen checks the INI file for an option preference file name other wise it uses '.gscreen_preferences' |
If there is a handler file Gscreen parses it, and registers the function calls into Gscreen's namespace. At this point Glade matches/registers all signal calls to functions in Gscreen and the handler file. Gscreen checks the INI file for an option preference file name otherwise it uses '.gscreen_preferences' |
checks for classicladder realtime component. checks for the system wide GTK theme. collects the jogging increments from the INI file. collects the angular jogging increments from the INI file. collects the default and max jog rate from the INI. collects the max velocity of any axes from the INI's TRAJ section. |
Checks for classicladder realtime component. Checks for the system wide GTK theme. Collects the jogging increments from the INI file. Collects the angular jogging increments from the INI file. Collects the default and max jog rate from the INI. Collects the max velocity of any axes from the INI's TRAJ section. |
collect all the override setting from the INI. check if its a lathe config from the INI file. find the name of the tool_table,tool editor and param file from the INI. check the handler file for keybindings function ('initialize_keybindings(self)') or else use Gscreen stock one. check the handler file for pins function ('initialize_pins(self)') or else use Gscreen stock one. check the handler file for manual_toolchange function ('initialize_manual_toolchange(self)') or else use Gscreen stock one. check the handler file for connect_signals function ('initialize_connect_signals(self)') or else use Gscreen stock one. check the handler file for widgets function ('initialize_widgets(self)') or else use Gscreen stock one. set up messages specified in the INI file. tell HAL the Gscreen HAL component is finished making pins and is ready. if there is a terminal widget in the screen it will print all the Gscreen pins to it. |
Collect all the override setting from the INI. Check if its a lathe config from the INI file. Find the name of the tool_table,tool editor and param file from the INI. Check the handler file for keybindings function ('initialize_keybindings(self)') or else use Gscreen stock one. Check the handler file for pins function ('initialize_pins(self)') or else use Gscreen stock one. Check the handler file for manual_toolchange function ('initialize_manual_toolchange(self)') or else use Gscreen stock one. Check the handler file for connect_signals function ('initialize_connect_signals(self)') or else use Gscreen stock one. Check the handler file for widgets function ('initialize_widgets(self)') or else use Gscreen stock one. Set up messages specified in the INI file. Tell HAL the Gscreen HAL component is finished making pins and is ready. If there is a terminal widget in the screen it will print all the Gscreen pins to it. |
checks the handler file for 'timer_interupt(self)' function call otherwise use Gscreen's default function call. |
Checks the handler file for 'timer_interupt(self)' function call otherwise use Gscreen's default function call. |
Here is another screen : it's GTK widgets placed on top of a image file: The axes DROs in this pic are actual numbers from a running linuxcnc |
Here is another screen: it's GTK widgets placed on top of an image file: The axes DROs in this pic are actual numbers from a running LinuxCNC |
There are two files that can be used, individually or in combination to add customizations.
Local glade files and handler files
Normally Gscreen uses the stock GLADE file and possibly a handler file (if using a sample 'skin')
You can specify Gscreen to use 'local' Glade and handler files.
Gscreen looks in the folder that holds all the configuration files for the config you selected.
You can now tell Gscreen to just load the glade file and not connect it's internal signals to it - This allows gscreen to load any GTK builder saved glade file
This means you can display a completely custom screen, but also requires you to use a handler file.
Gscreen uses the GLADE file to define the widgets, show it can show and interact with them. Many of them have specific names, others have GALDE given generic names.
If the widget will be displayed but never changed then a generic name is fine.
If one needs to control or interact with the widget then a hopefully purposeful name is given (all names are unique).
If you change the name of a widget, Gscreen won't be able to find it. At best this makes the widget not work anymore at worst it will cause an error when loading
Widgets can also have signals defined for them in the GLADE editor. It defines what signal is given and what method to call
Gscreen's default screens don't use many signals defined in the editor, it defines them in the python code.
If you move (cut and paste) a widget with signals, the signals will not be copied. You must add them again manually.
Lets build a simple usable screen.
Build this in the GLADE editor ( if using a RIP package run it from a terminal after using . scripts/rip-environment ):
Things to note:
-The top level window must be called the default name, window1 Gscreen relies on this,
- EMC actions (on the left side selection pallet) end up being hal_actions on the top right panel description (a renaming miss)
-Add actions by clicking the one you want and then clicking somewhere on the window, they don't add anything visual to the window.
-Add all the ones you see on the top right.
-After adding the actions we must link the buttons to the actions for them to work.(see below)
-The gremlin widget doesn't have a default size, so setting a requested size is helpful.(see below)
-The sourceview widget will try to use the whole window, so adding it to a scrolled window will cover this. (This has already been done in the example).
-The buttons will expand as the window is made larger, which is ugly, so we will set the box they are in to not expand (see below).
-The button types to use depend on the emc_action used -eg emc_toggle_action usually require toggle buttons.(Follow the example for now)
In this screen we are using emc_actions to communicate to LinuxCNC the actions we want.
This allows us standard functions without adding python code in the handler file. Let's link the estop toogle button to the estop action
Select the estop toggle button and under the general tab look for 'Related Action' and click the button beside it.
Now select the toggle estop action. Now the button will toggle estop on and off when clicked.
Under the general tab you can change the text of the button's label to describe it's function.
Do this for all the buttons.
Select the gremlin widget. Click the common tab, set the requested height to 100, and click the checkbox beside it.
Click the horizontal box that holds the buttons. Click the packing tab and click 'expand' to 'No'
OK, that's it - we need to save it as tester.glade and save it in sim/gscreen/gscreen_custom/ folder.
Now launch LinuxCNC and click to sim/gscreen/gscreen_custom/tester and start it.
If all goes well our screen will pop up and the buttons will do their job.
This works because the tester.ini tells gscreen to look for and load tester.glade and tester_handler.py.
The tester_handler.py file is included in that folder and is coded just show the screen and not much else.
Since the special widgets directly communicate with LinuxCNC - you can still do useful things.
If your screen-needs are covered by the available special widgets then this is as far as you need to go to build a screen.
If you want something more there are still many tricks available, from just adding 'function calls' to get canned behaviour,
to coding your own python code to customize exactly what you want. But that means learning about handler files.
Gscreen starts by reading the options it was started with.
It sets the debug mode and sets the optional skin name.
It then checks to see if there are 'local' XML, handler and/or locale files in the config folder - It will use them instead of the default ones (in share/gscreen/skins/)
The main screen is loaded and translations set up.
If present the second screen will be loaded and translations set up.
Optional Audio is initialized if available.
It reads some of the INI file to initialize the units, and the number/type of axes.
It then initializes python's binding to HAL to build a userspace component with the Gscreen name.
GladeVCP's makepins is called to parse the XML file to build HAL pins for the HAL widgets and register the LinuxCNC connected widgets.
Now Gscreen checks for a 'local' handler file in the config folder or else uses the stock one from the skin folder.
If there is a handler file Gscreen parses it, and registers the function calls into Gscreen's namespace.
At this point Glade matches/registers all signal calls to functions in Gscreen and the handler file.
Gscreen checks the INI file for an option preference file name otherwise it uses '.gscreen_preferences'
Now it checks to see if there is a preference function call ('initialize_preferences(self)') in the handler file otherwise it uses the stock Gscreen one.
Checks for classicladder realtime component.
Checks for the system wide GTK theme.
Collects the jogging increments from the INI file.
Collects the angular jogging increments from the INI file.
Collects the default and max jog rate from the INI.
Collects the max velocity of any axes from the INI's TRAJ section.
If there are angular axes then collects the default and max velocity from the INI file.
Collect all the override setting from the INI.
Check if its a lathe config from the INI file.
Find the name of the tool_table,tool editor and param file from the INI.
Check the handler file for keybindings function ('initialize_keybindings(self)') or else use Gscreen stock one.
Check the handler file for pins function ('initialize_pins(self)') or else use Gscreen stock one.
Check the handler file for manual_toolchange function ('initialize_manual_toolchange(self)') or else use Gscreen stock one.
Check the handler file for connect_signals function ('initialize_connect_signals(self)') or else use Gscreen stock one.
Check the handler file for widgets function ('initialize_widgets(self)') or else use Gscreen stock one.
Set up messages specified in the INI file.
Tell HAL the Gscreen HAL component is finished making pins and is ready.
If there is a terminal widget in the screen it will print all the Gscreen pins to it.
Sets the display cycle time based on the INI file.
Checks the handler file for 'timer_interupt(self)' function call otherwise use Gscreen's default function call.