@@ -1979,6 +1979,8 @@ def _init_tooleditor(self):
19791979 self .widgets .tooledit1 .set_visible ("abcxyzuvwijq" , False )
19801980 for axis in self .axis_list :
19811981 self .widgets .tooledit1 .set_visible ("{0}" .format (axis ), True )
1982+ # hide select column
1983+ self .widgets .tooledit1 .wTree .get_object ("s1" ).set_visible (False )
19821984 # disconnect the key_press handler in the widget
19831985 tv = self .widgets .tooledit1 .wTree .get_object ("treeview1" )
19841986 tv .disconnect_by_func (self .widgets .tooledit1 .on_tree_navigate_key_press )
@@ -1997,25 +1999,37 @@ def _init_tooleditor(self):
19971999 btn_delete .set_size_request (56 , 56 )
19982000 btn_delete .set_label ("" )
19992001 btn_delete .set_image (self .widgets .img_tool_delete )
2002+ btn_delete .set_tooltip_text (_ ("Delete selected tools" ))
20002003 btn_delete .set_always_show_image (True )
2004+ btn_delete .disconnect_by_func (self .widgets .tooledit1 .delete )
2005+ btn_delete .connect ("clicked" ,self .on_btn_delete_tool_clicked )
20012006 # Add button
20022007 btn_add = self .widgets .tooledit1 .wTree .get_object ("add" )
20032008 btn_add .set_size_request (56 , 56 )
20042009 btn_add .set_label ("" )
20052010 btn_add .set_image (self .widgets .img_tool_add )
2011+ btn_add .set_tooltip_text (_ ("Add new tool" ))
20062012 btn_add .set_always_show_image (True )
2013+ btn_add .disconnect_by_func (self .widgets .tooledit1 .add )
2014+ btn_add .connect ("clicked" ,self .on_btn_add_tool_clicked )
20072015 # Reload button
20082016 btn_reload = self .widgets .tooledit1 .wTree .get_object ("reload" )
20092017 btn_reload .set_size_request (56 , 56 )
20102018 btn_reload .set_label ("" )
20112019 btn_reload .set_image (self .widgets .img_tool_reload )
2020+ btn_reload .set_tooltip_text (_ ("Reload tool table from file" ))
20122021 btn_reload .set_always_show_image (True )
2022+ btn_reload .disconnect_by_func (self .widgets .tooledit1 .reload )
2023+ btn_reload .connect ("clicked" ,self .on_btn_reload_tooltable_clicked )
20132024 # Save button
20142025 btn_save = self .widgets .tooledit1 .wTree .get_object ("apply" )
20152026 btn_save .set_size_request (56 , 56 )
20162027 btn_save .set_label ("" )
20172028 btn_save .set_image (self .widgets .img_tool_save )
2029+ btn_save .set_tooltip_text (_ ("Save tool table to file" ))
20182030 btn_save .set_always_show_image (True )
2031+ btn_save .disconnect_by_func (self .widgets .tooledit1 .save )
2032+ btn_save .connect ("clicked" ,self .on_btn_save_tool_changes_clicked )
20192033 # Create a label for current tool in spindle
20202034 lbl_tool = Gtk .Label ()
20212035 self .widgets .tooledit1 .lbl_tool = lbl_tool
@@ -2030,18 +2044,31 @@ def _init_tooleditor(self):
20302044 btn_calculator .set_active (self .toolpage_use_calc )
20312045 btn_calculator .connect ("toggled" , self .on_toolpage_use_calc_toggled )
20322046 buttonbox .pack_start (btn_calculator ,False ,False ,50 )
2033- column_cell_ids = ["toggle" , "tool#1" , "pos1" , "x1" , "y1" , "z1" , "a1" , "b1" , "c1" , "u1" , "v1" , "w1" ,
2034- "d1" , "front1" , "back1" , "orient1" , "cell_comments1" ]
2047+ column_cell_ids = ["toggle" , "tool#1" , "pos1" ,
2048+ "x1" , "y1" , "z1" , "a1" , "b1" , "c1" , "u1" , "v1" , "w1" ,
2049+ "d1" , "front1" , "back1" , "orient1" , "comments1" ]
20352050 for col , name in enumerate (column_cell_ids ):
2036- if col > 0 and col < 16 :
2051+ if col > 0 and col < 17 :
20372052 temp = self .widgets .tooledit1 .wTree .get_object ("cell_%s" % name )
2038- temp .connect ('editing-started' , self .on_tool_col_edit_started , col )
2039- # override 'tooledit_widget' method 'set_selected_tool'
2053+ if col < 16 : # calulator is only useful for nummeric columns (ie not for 'Comments')
2054+ temp .connect ('editing-started' , self .on_tool_col_edit_started , col )
2055+ temp .connect ('edited' , self .on_tool_col_edited )
2056+ self .widgets .tooledit1 .edited = False
2057+ # override 'tooledit_widget' method 'set_selected_tool' so we can set the label text
2058+ self .tooledit1_set_selected_tool = self .widgets .tooledit1 .set_selected_tool
20402059 self .widgets .tooledit1 .set_selected_tool = self .set_selected_tool
2060+ # override 'tooledit_widget' method 'toolfile_stale' so we can also update toolinfo
2061+ self .widgets .tooledit1 .toolfile_stale = self .toolfile_stale
2062+
2063+ def toolfile_stale (self ):
2064+ self ._update_toolinfo (self .widgets .tooledit1 .toolinfo_num )
2065+ self .widgets .tooledit1 .reload (None )
2066+ self .widgets .tooledit1 .set_selected_tool (self .widgets .tooledit1 .toolinfo_num )
20412067
20422068 def set_selected_tool (self , toolnumber ):
2043- lbl_tool_text = "Tool loaded: " + str (toolnumber )
2069+ lbl_tool_text = _ ( "Tool loaded: " ) + str (toolnumber )
20442070 self .widgets .tooledit1 .lbl_tool .set_text (lbl_tool_text )
2071+ self .tooledit1_set_selected_tool (toolnumber )
20452072
20462073 def on_tree_navigate_key_press (self , treeview , event , filter ):
20472074 keyname = Gdk .keyval_name (event .keyval )
@@ -2116,13 +2143,17 @@ def on_tool_col_edit_started(self, widget, filtered_path, new_text, col):
21162143 store [row ][col ] = value
21172144 else :
21182145 store [row ][col ] = f"{ value :11.4f} "
2146+ self .widgets .tooledit1 .edited = True
21192147 # this is needed to get offsetview out of editing mode
21202148 GLib .timeout_add (50 ,
21212149 toolview .set_cursor ,
21222150 toolpage .model .get_path (row ),
21232151 toolview .get_columns ()[0 ],
21242152 True )
21252153
2154+ def on_tool_col_edited (self , * args ):
2155+ self .widgets .tooledit1 .edited = True
2156+
21262157 def _init_themes (self ):
21272158 # If there are themes then add them to combo box
21282159 model = self .widgets .theme_choice .get_model ()
@@ -2598,6 +2629,8 @@ def _show_tooledit_tab(self, state):
25982629 self .widgets .ntb_preview .set_property ("show-tabs" , not state )
25992630 self .widgets .vbx_jog .hide ()
26002631 self .widgets .ntb_preview .set_current_page (2 )
2632+ self .widgets .tooledit1 .reload (None )
2633+ self .widgets .tooledit1 .edited = False
26012634 self .widgets .tooledit1 .set_selected_tool (self .stat .tool_in_spindle )
26022635 if self .widgets .chk_use_kb_on_tooledit .get_active ():
26032636 self .widgets .ntb_info .set_current_page (1 )
@@ -4702,6 +4735,29 @@ def on_btn_back_clicked(self, widget, data=None):
47024735 self .widgets .tbtn_fullsize_preview0 .set_active (False )
47034736 self .on_tbtn_fullsize_preview_toggled (self .widgets .tbtn_fullsize_preview0 )
47044737 else : # else we go to main button on manual
4738+ if self .widgets .tooledit1 .edited :
4739+ message = _ ("Discard unsaved changes and exit?" )
4740+ result = self .dialogs .yesno_dialog (self , message , _ ("Attention!" ))
4741+ if not result : # user says no, he want to save
4742+ return
4743+ # check if offset values for current tool have been changed
4744+ tt = self .stat .tool_table [0 ]
4745+ new_offset = (tt .xoffset , tt .yoffset , tt .zoffset ,
4746+ tt .aoffset , tt .boffset , tt .coffset ,
4747+ tt .uoffset , tt .voffset , tt .woffset )
4748+ if (new_offset != self .stat .tool_offset ) and ("G43" in self .active_gcodes ):
4749+ message = _ ("Offset values for the tool in the spindle\n " \
4750+ "have been changed whith tool compensation (G43) active.\n \n " \
4751+ "Do you want the new values to be applied as the currently\n " \
4752+ "active tool offset?" )
4753+ result = self .dialogs .yesno_dialog (self , message , _ ("Attention!" ))
4754+ if result : # user says YES
4755+ self .command .mode (linuxcnc .MODE_MDI )
4756+ self .command .wait_complete ()
4757+ self .command .mdi ("G43" )
4758+ self .command .wait_complete ()
4759+ self .command .mode (linuxcnc .MODE_MANUAL )
4760+ self .command .wait_complete ()
47054761 self .widgets .ntb_button .set_current_page (_BB_MANUAL )
47064762 self .widgets .ntb_main .set_current_page (0 )
47074763 self .widgets .ntb_preview .set_current_page (0 )
@@ -5436,26 +5492,32 @@ def on_tool_change(self, widget):
54365492 self .halcomp ['toolchange-changed' ] = False
54375493
54385494 def on_btn_delete_tool_clicked (self , widget , data = None ):
5439- act_tool = self .stat . tool_in_spindle
5440- if act_tool == self . widgets . tooledit1 . get_selected_tool () :
5495+ selected_tool = self .widgets . tooledit1 . get_selected_row ()
5496+ if self . stat . tool_in_spindle == selected_tool :
54415497 message = _ ("You are trying to delete the tool mounted in the spindle\n " )
54425498 message += _ ("This is not allowed, please change tool prior to delete it" )
54435499 self .dialogs .warning_dialog (self , _ ("Warning Tool can not be deleted!" ), message )
54445500 return
5445-
5446- self .widgets .tooledit1 .delete (None )
5447- self .widgets .tooledit1 .set_selected_tool (act_tool )
5501+ self .widgets .tooledit1 .delete_selected_row (widget )
5502+ self .widgets .tooledit1 .edited = True
54485503
54495504 def on_btn_add_tool_clicked (self , widget , data = None ):
54505505 self .widgets .tooledit1 .add (None )
5506+ self .widgets .tooledit1 .edited = True
54515507
54525508 def on_btn_reload_tooltable_clicked (self , widget , data = None ):
5509+ if self .widgets .tooledit1 .edited :
5510+ message = _ ("Discard unsaved changes and reload the table?" )
5511+ result = self .dialogs .yesno_dialog (self , message , _ ("Attention!" ))
5512+ if not result : # user says no, he want to save
5513+ return
54535514 self .widgets .tooledit1 .reload (None )
5515+ self .widgets .tooledit1 .edited = False
54545516 self .widgets .tooledit1 .set_selected_tool (self .stat .tool_in_spindle )
54555517
54565518 def on_btn_save_tool_changes_clicked (self , widget , data = None ):
54575519 self .widgets .tooledit1 .save (None )
5458- self .widgets .tooledit1 .set_selected_tool ( self . stat . tool_in_spindle )
5520+ self .widgets .tooledit1 .edited = False
54595521
54605522 def on_btn_tool_touchoff_clicked (self , widget , data = None ):
54615523 if not self .widgets .tooledit1 .get_selected_tool ():
@@ -5512,6 +5574,11 @@ def on_btn_tool_touchoff_clicked(self, widget, data=None):
55125574
55135575 # select a tool entering a number
55145576 def on_btn_select_tool_by_no_clicked (self , widget , data = None ):
5577+ if self .widgets .tooledit1 .edited :
5578+ message = _ ("Discard unsaved changes and change tool?" )
5579+ result = self .dialogs .yesno_dialog (self , message , _ ("Attention!" ))
5580+ if not result : # user says no, he want to save
5581+ return
55155582 value = self .dialogs .entry_dialog (self , data = None , header = _ ("Enter the tool number as integer " ),
55165583 label = _ ("Select the tool to change" ), integer = True )
55175584 if value == "ERROR" :
@@ -5534,9 +5601,14 @@ def on_btn_select_tool_by_no_clicked(self, widget, data=None):
55345601 # Next two lines fix issue #3129 caused by GStat missing changes in interpreter mode
55355602 command = "G4 P{0}" .format (self .get_ini_info .get_cycle_time ()/ 1000 )
55365603 self .command .mdi (command )
5537-
5604+
55385605 # set tool with M61 Q? or with T? M6
55395606 def on_btn_selected_tool_clicked (self , widget , data = None ):
5607+ if self .widgets .tooledit1 .edited :
5608+ message = _ ("Discard unsaved changes and change tool?" )
5609+ result = self .dialogs .yesno_dialog (self , message , _ ("Attention!" ))
5610+ if not result : # user says no, he want to save
5611+ return
55405612 tool = self .widgets .tooledit1 .get_selected_row ()
55415613 if tool == None :
55425614 message = _ ("you selected no or more than one tool, the tool selection must be unique" )
0 commit comments