libraries are prebuilt python modules that give added features to QTvcp.
In this way you can select what features you want - yet don’t have to build common ones yourself.
1. STATUS
STATUS is a library that sends GObject messages based on linuxcnc’s current state.
It is an extension of gladevcp’s GStat object. GStats
It also has some functions to give status on such things as internal jog rate.
You connect a function call to the STATUS message you are interested in.
QTvcp will call this function when the message is sent from STATUS.
To import this modules add this python code to your import section:
############################ # **** IMPORT SECTION **** # ############################ from qtvcp.core import Status
To instantiate the module so you can use it add this python code to your instantiate section:
STATUS = Status()
To connect to messages use GObject syntax. For example to catch machine on and off messages,
Note
|
This example shows the two common ways of connecting signals. Notice one uses lambda. lambda is used to strip off or manipulate arguments from the status message before calling the function. You can see the difference in the called function signature. the one that uses lambda does not accept the status object - lambda did not pass it to the function. |
place these commands into the INITIALIZE section:
STATUS.connect('state-on', self.on_state_on) STATUS.connect('state-off', lambda: w, self.on_state_off())
These would call functions that looks like these:
def on_state_on(self, status_object): print 'Linuxcnc machine is on' def on_state_off(self): print 'Linuxcnc machine is off'
In this example code when linuxcnc is in machine on state the function self.on_state_on will be called.
When linuxcnc is in machine off state the function self.on_state_off will be called.
2. INFO
INFO is a library to collect and filters data from the INI file.
The available data and defaults:
LINUXCNC_IS_RUNNING
LINUXCNC_VERSION
INIPATH
INI = linuxcnc.ini(INIPATH)
MDI_HISTORY_PATH = '~/.axis_mdi_history'
QTVCP_LOG_HISTORY_PATH = '~/qtvcp.log'
MACHINE_LOG_HISTORY_PATH = '~/.machine_log_history'
PREFERENCE_PATH = '~/.Preferences'
SUB_PATH = None
SUB_PATH_LIST = []
self.MACRO_PATH = None
MACRO_PATH_LIST = []
INI_MACROS = self.INI.findall("DISPLAY", "MACRO")
IMAGE_PATH = IMAGEDIR
LIB_PATH = os.path.join(HOME, "share","qtvcp")
PROGRAM_FILTERS = None
PARAMETER_FILE = None
MACHINE_IS_LATHE = False
MACHINE_IS_METRIC = False
MACHINE_UNIT_CONVERSION = 1
MACHINE_UNIT_CONVERSION_9 = [1]*9
TRAJ_COORDINATES =
JOINT_COUNT = int(self.INI.find("KINS","JOINTS")or 0)
AVAILABLE_AXES = ['X','Y','Z']
AVAILABLE_JOINTS = [0,1,2]
GET_NAME_FROM_JOINT = {0:'X',1:'Y',2:'Z'}
GET_JOG_FROM_NAME = {'X':0,'Y':1,'Z':2}
NO_HOME_REQUIRED = False
HOME_ALL_FLAG
JOINT_TYPE = self.INI.find(section, "TYPE") or "LINEAR"
JOINT_SEQUENCE_LIST
JOINT_SYNC_LIST
JOG_INCREMENTS = None
ANGULAR_INCREMENTS = None
GRID_INCREMENTS
DEFAULT_LINEAR_JOG_VEL = 15 units per minute
MIN_LINEAR_JOG_VEL = 60 units per minute
MAX_LINEAR_JOG_VEL = 300 units per minute
DEFAULT_ANGULAR_JOG_VEL =
MIN_ANGULAR_JOG_VEL =
MAX_ANGULAR_JOG_VEL =
MAX_FEED_OVERRIDE =
MAX_TRAJ_VELOCITY =
AVAILABLE_SPINDLES = int(self.INI.find("TRAJ", "SPINDLES") or 1)
DEFAULT_SPINDLE_0_SPEED = 200
MAX_SPINDLE_0_SPEED = 2500
MAX_SPINDLE_0_OVERRIDE = 100
MIN_SPINDLE_0_OVERRIDE = 50
MAX_FEED_OVERRIDE = 1.5
MAX_TRAJ_VELOCITY
# user message dialog info
USRMESS_BOLDTEXT = self.INI.findall("DISPLAY", "MESSAGE_BOLDTEXT")
USRMESS_TEXT = self.INI.findall("DISPLAY", "MESSAGE_TEXT")
USRMESS_TYPE = self.INI.findall("DISPLAY", "MESSAGE_TYPE")
USRMESS_PINNAME = self.INI.findall("DISPLAY", "MESSAGE_PINNAME")
USRMESS_DETAILS = self.INI.findall("DISPLAY", "MESSAGE_DETAILS")
USRMESS_ICON = self.INI.findall("DISPLAY", "MESSAGE_ICON")
ZIPPED_USRMESS =
self.GLADEVCP = (self.INI.find("DISPLAY", "GLADEVCP")) or None
# embeded program info
TAB_NAMES = (self.INI.findall("DISPLAY", "EMBED_TAB_NAME")) or None
TAB_LOCATION = (self.INI.findall("DISPLAY", "EMBED_TAB_LOCATION")) or []
TAB_CMD = (self.INI.findall("DISPLAY", "EMBED_TAB_COMMAND")) or None
ZIPPED_TABS =
MDI_COMMAND_LIST = (heading: [MDI_COMMAND_LIST], title: MDI_COMMAND")
TOOL_FILE_PATH = (heading: [EMCIO], title:TOOL_TABLE)
POSTGUI_HALFILE_PATH = (heading: [HAL], title: POSTGUI_HALFILE)
There are some helper functions - mostly used for widget support
get_error_safe_setting(self, heading, detail, default=None)
convert_metric_to_machine(data)
convert_imperial_to_machine(data)
convert_9_metric_to_machine(data)
convert_9_imperial_to_machine(data)
convert_units(data)
convert_units_9(data)
get_filter_program(fname)
get_qt_filter_extensions()
To import this modules add this python code to your import section:
############################ # **** IMPORT SECTION **** # ############################ from qtvcp.core import Info
To instantiate the module so you can use it in a handler file add this python code to your instantiate section:
########################################### # **** INSTANTIATE LIBRARIES SECTION **** # ########################################### INFO = Info()
To access INFO data use this general syntax:
home_state = INFO.NO_HOME_REQUIRED if INFO.MACHINE_IS_METRIC is True: print 'Metric based'
3. Action
This library is used to command linuxcnc’s motion controller.
It tries to hide incidental details and add convenience methods for developers.
To import this modules add this python code to your import section:
############################ # **** IMPORT SECTION **** # ############################ from qtvcp.core import Action
To instantiate the module so you can use it add this python code to your instantiate section:
########################################### # **** INSTANTIATE LIBRARIES SECTION **** # ########################################### ACTION = Action()
To access Action commands use general syntax such as these:
ACTION.SET_ESTOP_STATE(state) ACTION.SET_MACHINE_STATE(state) ACTION.SET_MACHINE_HOMING(joint) ACTION.SET_MACHINE_UNHOMED(joint) ACTION.SET_LIMITS_OVERRIDE() ACTION.SET_MDI_MODE() ACTION.SET_MANUAL_MODE() ACTION.SET_AUTO_MODE() ACTION.SET_LIMITS_OVERRIDE() ACTION.CALL_MDI(code) ACTION.CALL_MDI_WAIT(code) ACTION.CALL_INI_MDI(number) ACTION.CALL_OWORD() ACTION.OPEN_PROGRAM(filename) ACTION.SAVE_PROGRAM(text_source, fname): ACTION.SET_AXIS_ORIGIN(axis,value) ACTION.SET_TOOL_OFFSET(axis,value,fixture = False) ACTION.RUN() ACTION.ABORT() ACTION.PAUSE() ACTION.SET_MAX_VELOCITY_RATE(rate) ACTION.SET_RAPID_RATE(rate) ACTION.SET_FEED_RATE(rate) ACTION.SET_SPINDLE_RATE(rate) ACTION.SET_JOG_RATE(rate) ACTION.SET_JOG_INCR(incr) ACTION.SET_JOG_RATE_ANGULAR(rate) ACTION.SET_JOG_INCR_ANGULAR(incr, text) ACTION.SET_SPINDLE_ROTATION(direction = 1, rpm = 100, number = 0) ACTION.SET_SPINDLE_FASTER(number = 0) ACTION.SET_SPINDLE_SLOWER(number = 0) ACTION.SET_SPINDLE_STOP(number = 0) ACTION.SET_USER_SYSTEM(system) ACTION.ZERO_G92_OFFSET() ACTION.ZERO_ROTATIONAL_OFFSET() ACTION.ZERO_G5X_OFFSET(num) ACTION.RECORD_CURRENT_MODE() ACTION.RESTORE_RECORDED_MODE() ACTION.SET_SELECTED_AXIS(jointnum) ACTION.DO_JOG(jointnum, direction) ACTION.JOG(jointnum, direction, rate, distance=0) ACTION.TOGGLE_FLOOD() ACTION.SET_FLOOD_ON() ACTION.SET_FLOOD_OFF() ACTION.TOGGLE_MIST() ACTION.SET_MIST_ON() ACTION.SET_MIST_OFF() ACTION.RELOAD_TOOLTABLE() ACTION.UPDATE_VAR_FILE() ACTION.TOGGLE_OPTIONAL_STOP() ACTION.SET_OPTIONAL_STOP_ON() ACTION.SET_OPTIONAL_STOP_OFF() ACTION.TOGGLE_BLOCK_DELETE() ACTION.SET_BLOCK_DELETE_ON() ACTION.SET_BLOCK_DELETE_OFF() ACTION.RELOAD_DISPLAY() ACTION.SET_GRAPHICS_VIEW(view) ACTION.UPDATE_MACHINE_LOG(text, option=None): ACTION.CALL_DIALOG(command): ACTION.HIDE_POINTER(state): ACTION.PLAY_SOUND(path): ACTION.PLAY_ERROR(): ACTION.PLAY_DONE(): ACTION.PLAY_READY(): ACTION.PLAY_ATTENTION(): ACTION.PLAY_LOGIN(): ACTION.PLAY_LOGOUT(): ACTION.SPEAK(speech): ACTION.BEEP(): ACTION.BEEP_RING(): ACTION.BEEP_START():
There are some helper functions - mostly used for this library’s support
get_jog_info (num) jnum_check(num) ensure_mode(modes) open_filter_program(filename, filter)
4. TOOL
This library handles tool offset file changes.
Linuxcnc doesn’t handle third party manipulation of the tool file well.
4.1. GET_TOOL_INFO(toolnumber)
This will return a Python list of information on the requested tool number.
4.2. GET_TOOL_ARRAY()
This return a single python list of python lists of tool information.
This is a raw list formed from the system tool file.
4.3. GET_TOOL_MODELS()
This will return a python tuple of two Python lists of Python lists of tool information.
[0] will be real tools information
[1] will be wear tool information (tool numbers will be over 10000; Fanuc style tool wear)
4.4. ADD_TOOL(newtool = [-99, 0,0,0,0,0,0,0,0,0,0,0,0,0, 0,New Tool])
This will by default, add a black tool entry with tool number -99.
You can preload the newtool array with tool information.
4.5. DELETE_TOOLS( tool)
Delete the numbered tool
4.6. SAVE_TOOLFILE(toolarray)
This will parse the toolarray and save it to the file specified in the INI as the tool path.
This tool array must contain all the available tools information.
This array is expected to use the linuxcnc raw tool array - (doesn’t have tool wear entries)
it will return True if there was an error.
4.7. CONVERT_TO_WEAR_TYPE(toolarray)
This function converts a linuxcnc raw tool array to a qtvcp tool wear array.
Qtvcp’s array includes entries for X and Z axis tool wear.
inuxcnc covers tool wear by adding tool wear information into tool entries above 10000.
This also requires remap code to add the wear offsets at tool change time.
4.8. CONVERT_TO_STANDARD_TYPE(toolarray)
This function converts qtvcp’s tool array into a linuxcnc raw tool array.
Qtvcp’s array includes entries for X and Z axis tool wear.
linuxcnc covers tool wear by adding tool wear information into tool entries above 10000.
This also requires remap code to add the wear offsets t tool change time.
5. Path
This module give reference to important file paths.
To import this modules add this python code to your import section:
############################ # **** IMPORT SECTION **** # ############################ from qtvcp,core import Path
To instantiate the module so you can use it add this python code to your instantiated section:
########################################### # **** INSTANTIATE LIBRARIES SECTION **** # ########################################### PATH = Path()
5.1. Here is a list of the variables:
PATH.PREFS_FILENAME # The preference file path PATH.WORKINGDIR # The directory qtvcp was launched from PATH.IS_SCREEN # Is this a screen or a VCP? PATH.CONFIGPATH # launched configuration folder PATH.BASEDIR # Base folder for linuxcnc PATH.BASENAME # The Designer files name (no ending) PATH.LIBDIR # The Qtvcp library folder PATH.IMAGEDIR # The Qtvcp image folder PATH.SCREENDIR # The Qtvcp builtin Screen folder PATH.PANELDIR # The Qtvcp builtin VCP folder PATH.HANDLER # Handler file Path PATH.XML # Qtvcp ui file path PATH.QSS # Qtvcp Qss file path # Not currently used: PATH.LOCALEDIR # Locale translation folder PATH.DOMAIN # Translation domain
6. VCPWindow
This module give reference to the Main window and widgets.
Typically this would be used for a library (eg, toolbar library uses it.) as
the widgets get a reference to the main window from the _hal_init() function.
To import this modules add this python code:
############################ # **** IMPORT SECTION **** # ############################ from qtvcp.qt_makegui import VCPWindow
To instantiate the module so you can use it add this python code:
########################################### # **** INSTANTIATE LIBRARIES SECTION **** # ########################################### WIDGETS = VCPWindow()
7. aux_program_loader
This module allows an easy way to load auxiliary programs linuxcnc often uses.
To import this modules add this python code to your import section:
############################ # **** IMPORT SECTION **** # ############################ from qtvcp.lib.aux_program_loader import Aux_program_loader
To instantiate the module so you can use it add this python code to your instantiated section:
########################################### # **** INSTANTIATE LIBRARIES SECTION **** # ########################################### AUX_PRGM = Aux_program_loader()
7.1. HALmeter
Halmeter is used to display one HAL pin data. load a halmeter with:
AUX_PRGM.load_halmeter()
7.2. classicladder user program
AUX_PRGM.load_ladder()
7.3. linuxcnc status program
AUX_PRGM.load_status()
7.4. HALshow configure display program
AUX_PRGM.load_halshow()
7.4.1. HALscope program
AUX_PRGM.load_halscope()
7.5. tooledit program
AUX_PRGM.load_tooledit(TOOLEFILE_PATH)
7.6. calibration
AUX_PRGM.load_calibration()
7.7. onboard/matchbox keyboard
AUX_PRGM.keyboard_onboard(ARGS)
8. Keybindings
This module is used to allow each keypress to control a behavior such as jogging.
It’s used inside the handler file to facilitate keyboard jogging etc.
8.1. Importing and Initiating
To import this modules add this python code to your import section:
############################ # **** IMPORT SECTION **** # ############################ from qtvcp.lib.keybindings import Keylookup
To instantiate the module so you can use it add this python code to your instantiate section:
########################################### # **** INSTANTIATE LIBRARIES SECTION **** # ########################################### KEYBIND = Keylookup()
8.2. adding key bndings
Note keybindings require code under the processed_key_event function
to call KEYBIND.call() - most handler file already have this code.
In the handler file, under the initialed function use this general syntaxt:
KEYBINDING.add_call("DEFINED_KEY","FUNCTION TO CALL", USER DATA)
Here we add a keybinding for F10, 11 and 12
########################################## # Special Functions called from QTVCP ########################################## # at this point: # the widgets are instantiated. # the HAL pins are built but HAL is not set ready def initialized__(self): KEYBIND.add_call('Key_F10','on_keycall_F10',None) KEYBIND.add_call('Key_F11','on_keycall_override',10) KEYBIND.add_call('Key_F12','on_keycall_override',20)
And then need to add functions that get called:
In the handler file, under the KEY BINDING CALLS
section add this:
##################### # KEY BINDING CALLS # ##################### def on_keycall_F12(self,event,state,shift,cntrl,value): if state: print 'F12 pressed' def on_keycall_override(self,event,state,shift,cntrl,value): if state: print 'value = {}'.format(value)
9. Messages
This modules is used to display pop up dialog messages on the screen.
These are defined in the INI file and controlled by HAL pins.
Boldtext is generally a title.
text is below that and usually longer.
Detail is hidden unless clicked on.
pinname is the basename of the HAL pins.
type specifies whether its a yes/no, ok, or status message.
Status messages will be shown in the status bar and the notify dialog.
it requires no user intervention.
ok messages require the user to click ok to close the dialog.
ok messages have one HAL pin to launch the dialog and one to signify it’s waiting
for response.
yes/no messages require the user to select yes or no buttons to close the dialog.
yes/no messages have three hal pins - one to show the dialog, one for waiting,
and one for the answer.
By default it will send STATUS messages for focus_overlay anf alert sound.
These will silently fail if those options are not set up.
Here is a sample INI code. It would be under the [DISPLAY] heading.
# This just shows in the status bar and desktop notify popup.
MESSAGE_BOLDTEXT = NONE
MESSAGE_TEXT = This is a statusbar test
MESSAGE_DETAILS = STATUS DETAILS
MESSAGE_TYPE = status
MESSAGE_PINNAME = statustest
# This will pop up a dialog that asks a yes no question
MESSAGE_BOLDTEXT = NONE
MESSAGE_TEXT = This is a yes no dialog test
MESSAGE_DETAILS = Y/N DETAILS
MESSAGE_TYPE = yesnodialog
MESSAGE_PINNAME = yndialogtest
# This pops up a dialog that requires an ok response and it shows in the status bar and
# the destop notify popup.
MESSAGE_BOLDTEXT = This is the short text
MESSAGE_TEXT = This is the longer text of the both type test. It can be longer then the status bar text
MESSAGE_DETAILS = BOTH DETAILS
MESSAGE_TYPE = okdialog status
MESSAGE_PINNAME = bothtest
The screenoptions widget can automatically set up the message system.
10. notify
This module is used to send messages that are integrated into the desktop.
it uses the pynotify library.
Ubuntu/Mint does not follow the standard - you can’t set how long the message stays up for.
I suggest fixing this with a PPA off the net
https://launchpad.net/~leolik/+archive/leolik?field.series_filter=lucid
you can set the title, message, icon, and timeout.
Notify keeps a list of all the alarm messages since starting in self.alarmpage.
If you click show all messages in the notify popup, it will print then to the terminal.
The screenoptions widget can automatically set up the notify system.
Typically STATUS messages are used to sent notify messages.
11. preferences
This module allows one to load and save preference data permanently to storage media.
The screenoptions widget can automatically set up the preference system.
qtvcp searches for the screenoption widget first and if found calls pref_init().
This will create the preference object and return it to qtvcp to pass to all the widgets and
add it to the window object attributes. In this case the preferences object would be accesable
from the handler file’s initialized method as self.w.PREFS_
Also all widgets can have access to a specific preference file at initialization time.
The screenoptions widget can automatically set up the preference file.
12. audio player
This module allows playing sounds using gstreamer, beep and espeak
It can play sounds/music files using gstreamer (non blocking)
It can play sounds using the beep library (currently blocks while beeping)
It can speak using the espeak library (non blocks while speaking)
There are default alert sounds using Mint or freedesktop default sounds.
You can play arbitrary sounds or even songs by specifying the path.
STATUS has messages to control this module.
The screenoptions widget can automatically set up the audio system.
Or to import this modules manually add this python code to your import section:
############################ # **** IMPORT SECTION **** # ############################ from qtvcp.lib.audio_player import Player
To instantiate the module so you can use it add this python code to your instantiated section:
_register_messages() function connects the audio player to the STATUS library for sounds can be played
with the STATUS message system.
########################################### # **** INSTANTIATE LIBRARIES SECTION **** # ########################################### SOUND = Player() SOUND._register_messages()
To play sounds using STATUS messages use these general syntax:
STATUS.emit('play-alert','LOGOUT') STATUS.emit('play-alert','BEEP') STATUS.emit('play-alert','SPEAK This is a test screen for Qt V C P') STATUS.emit('play-sound', 'PATH TO SOUND')
There are default alerts to choose from:
ERROR
READY
ATTENTION
RING
DONE
LOGIN
LOGOUT
There are three beeps:
BEEP_RING
BEEP_START
BEEP
13. virtual keyboard
This library allows you to use STATUS messages to launch a virtual keyboard.
It uses Onboard or Matchbox library for the keyboard.
14. TOOLBAR ACTIONS
This library supplies prebuilt submenus and actions for toolbar menus and toolbar buttons.
Toolbuttons, menu and toolbar menus are built in designer and assigned actions/submenus in the handler file.
Actions:
estop
power
load
reload
gcode_properties
run
pause
abort
block_delete
optional_stop
touchoffworkplace
touchofffixture
runfromline
load_calibration
load_halmeter
load_halshow
load_status
load_halscope
about
zoom_in
zoom_out
view_x
view_y
view_y2
view_z
view_z2
view_p
view_clear
show_offsets
quit
system_shutdown
tooloffsetdialog
originoffsetdialog
calculatordialog
alphamode
inhibit_selection
show_dimensions
Submenus:
recent_submenu
home_submenu
unhome_submenu
zero_systems_submenu
grid_size_submenu
14.1. Importing and Initiating
Here is the typical code to add to the relevant handler file sections.
############################ # **** IMPORT SECTION **** # ############################ from qtvcp.lib.toolbar_actions import ToolBarActions ########################################### # **** instantiate libraries section **** # ########################################### TOOLBAR = ToolBarActions()
14.2. Assigning tool actions to toolbar buttons
########################################## # Special Functions called from QTVCP ########################################## # at this point: # the widgets are instantiated. # the HAL pins are built but HAL is not set ready def initialized__(self): TOOLBAR.configure_submenu(self.w.menuHoming, 'home_submenu') TOOLBAR.configure_action(self.w.actionEstop, 'estop') TOOLBAR.configure_action(self.w.actionQuit, 'quit', lambda d:self.w.close()) TOOLBAR.configure_action(self.w.actionEdit, 'edit', self.edit) # Add a custom function TOOLBAR.configure_action(self.w.actionMyFunction, 'my_Function', self.my_function)
14.3. Add a custom toolbar function:
In the GENERAL FUNCTIONS SECTION ADD:
##################### # general functions # ##################### def my_function(self, widget, state): print 'My function State = ()'.format(state)