# *CUT_METHODS.TCL ############################################################################### # cut_methods.tcl - DBC Event Handler for Cut Methods database stored # as ascii file ############################################################################### # REVISIONS # Date Who Reason # 03/24/99 Murthy Mandaleeka Initial # 05/19/99 Murthy Mandaleeka New Environment Variable # 07/21/99 Subhash Included dbc_general_ascii.tcl file # 07/21/99 Subhash Used general functions for # opening and reading dat files. # 08/06/99 Subhash Removed some unwanted comments # 08/20/99 Subhash Added procedure # ASC_file_execute_query_check_attr # to search for the records with the # same mode as the operation. # This procedure is a modification of # ASC_file_execute_query # 11/11/2003 rlm Add ASC_output_header # 01/30/2004 rlm Move ASC_write to dbc_ascii_general # 02/12/2004 rlm Add last revision information # 06/28/2011 Peter Mao 6556892 Add DBC_ask_library_values # 08/10/2020 Yusheng Chen 9847704 Initialize file_unit in DBC_retrieve # 08/12/2023 Xi Wang Add ASC_translate_att_alias in DBC_translate_att_alias to fix query ############################################################################## # # The format of each line in the text file is: # # cut_method_index - Integer # machine_mode - String # cut_method - String #------------------------------------------------------------------------------- #--------------------------------------------- # Non DBC Global Variables #--------------------------------------------- #MOM_set_debug_mode ON #set dbFileName "[MOM_ask_env_var UGII_CAM_LIBRARY_FEEDS_SPEEDS_DATA_DIR]cut_methods.dat" set DEBUG 0 set fPointer "" #--------------------------------------------- # Global variables set by DBC for Input/Output #--------------------------------------------- set dbc_lhs_exp "" set dbc_rhs_exp "" set dbc_relop "" set dbc_query "" set dbc_subqry1 "" set dbc_subqry2 "" set dbc_boolop "" set dbc_class_name "" set dbc_attr_count 0 set dbc_attr_id "" set dbc_query_count 0 set dbc_cutmthd_libref "" set dbc_var_list "" set dbc_machine_mode "MILL" set asc_debug 0 #--------------------------------------------- proc ASC_t_create_filename {env_var_name filename} \ { # # Creates a complete filename by evaluating an environment variable # for the directory information # set env_var [MOM_ask_env_var $env_var_name] if { $env_var == "" } \ { set message "Can't read environment variable $env_var_name" MOM_abort "\n $message" } set fname "" set fname [append fname $env_var $filename] return $fname } #--------------------------------------------- proc MOM__boot {} { #--------------------------------------------- # source some general procedures # # dbc_ascii_general.tcl # set filename \ [ASC_t_create_filename "UGII_UG_LIBRARY_DIR" "dbc_ascii_general.tcl"] if { [catch {source $filename}] == "1" } \ { set message "Can't load .tcl file: $filename" MOM_abort "\n $message" } } proc MOM__halt {} \ { } #------------------------------------------------------------ proc DBC_init_db { } \ { global DEBUG global dataBase global lastRowNumber global dbFileName global fPointer global asc_file_name set asc_part_units "" set data_unit 0 set mode 0 # # Set the filename for ASCII Data File # ASC_set_data_file_name # # And load the file into memory # # ASC_load_data_file $asc_file_name $data_unit $mode # Since we are now reading the records one by one, no need to load # the data file. ( Changed on 20-Aug-99 ) } #--------------------------------------------- proc ASC_set_data_file_name {} { #--------------------------------------------- global dbc_part_units global asc_file_name global asc_part_units MOM_ask_part_units ;# writes to dbc_part_units set env_var UGII_CAM_LIBRARY_FEEDS_SPEEDS_DATA_DIR set asc_file_name [ASC_t_create_filename "$env_var" "cut_methods.dat"] set asc_part_units $dbc_part_units } #--------------------------------------------- proc DBC_translate_att_alias {} { #--------------------------------------------- global DEBUG global dbc_alias global dbc_id # The input dbc_id is the column in the RSET # set dbc_id "\$dataBase($dbc_id)" ASC_translate_att_alias } #------------------------------------------------------------ proc DBC_create_criterion { } { #------------------------------------------------------------ global DEBUG global dbc_lhs_exp global dbc_rhs_exp global dbc_relop global dbc_query # set dbc_query "\[$dbc_lhs_exp\] $dbc_relop \[$dbc_rhs_exp\]" ASC_create_criterion } #------------------------------------------------------------------------ proc DBC_create_query { } { #------------------------------------------------------------------------ global DEBUG global dbc_query global dbc_subqry1 global dbc_subqry2 global dbc_boolop set dbc_query "$dbc_subqry1 $dbc_boolop $dbc_subqry2" ASC_create_query } #--------------------------------------------- proc ASC_file_execute_query_check_attr { file_name file_unit } \ { # # Executes query on cut_methods file. This procedure is derived from # ASC_file_execute_query.It is slightly modified so that an attribute # of the record can be checked for some value and then populated to Rset # # Input filename - name of the database file, in this case cut_methods.dat # # file_unit - Unit of the records, in this case none # # Returns 0 -> Succesful Loading # 1 -> File open error # global asc_debug global dbc_class_name global dbc_query global dbc_query_count global dbc_attr_count global dbc_attr_aliases global dbc_attr_id global asc_database global asc_database_count global dbc_machine_mode global asc_next_line if { $asc_debug == "1" } { puts "ASC_file_execute_query" puts "dbc_class_name = $dbc_class_name" puts "dbc_query = $dbc_query" } # The following procedure writes to the variables # dbc_attr_count, dbc_attr_aliases DBC_load_rset_data # # Open the file # set ret_code [catch {open $file_name "r"} fp] if { $ret_code } \ { return 1 } ASC_init_database # # Loop over all the DATA records # # The db_row variable has to be initialized (see also ASC_translate_att_alias) set db_row 0 set rset_row 0 set asc_next_line "" while {[ASC_read_next_db_object $fp $file_name $file_unit $db_row] >= 0} \ { set local_dbc_machine_mode [ASC_ask_att_val MODE $db_row "" 0 flag] if {[string compare $dbc_machine_mode $local_dbc_machine_mode] == 0 || [string compare $dbc_machine_mode "ALL"] == 0 } \ { set dum [catch {expr $dbc_query} ret] if { $ret == "1" } \ { ASCi_write_to_rset fp $dbc_attr_count dbc_attr_aliases \ $rset_row $db_row incr rset_row incr dbc_query_count } catch {unset asc_database} set asc_database_count 0 } } if { $asc_debug == "1" } { puts "End of ASC_file_execute_query " puts "Count: $dbc_query_count" } close $fp return 0 } #------------------------------------------------------------------------ proc DBC_execute_query { } { #------------------------------------------------------------------------ global asc_units global file_unit global asc_file_name set file_unit $asc_units(unknown) ASC_file_execute_query_check_attr $asc_file_name $file_unit } #--------------------------------------------------------------------- proc DBC_retrieve { } { #--------------------------------------------------------------------- global DEBUG global dbc_libref global dbc_retrieve_var_list global dataBase global dbc_machine_mode global dbc_name global dbc_description global dbFileName global fPointer global asc_debug global asc_database_count global asc_file_name global file_unit # intialize file_unit if { ![info exists file_unit] } { global dbc_part_units global asc_units MOM_ask_part_units ;# writes to dbc_part_units if { $dbc_part_units == "metric" } { set file_unit $asc_units(mm) } else { set file_unit $asc_units(inch) } } if { $asc_debug == "1" } \ { puts " ==========================================" puts " procedure DBC_retrieve for cut methods" puts " libref -> $dbc_libref" } # # Look for the desired libref # set found 2 set found [ASC_file_find_object_by_att $asc_file_name $file_unit \ LIBRF $dbc_libref db_row] if { $found == 2 } \ { set message "Error retrieving Cut Method from external library." set message "$message \n Cut Method with the library reference $dbc_libref" set message "$message \n does not exist in the" set message "$message \n ASCII Data File: $asc_file_name" MOM_abort "\n $message" } if { $found == 1 } \ { set message "Error retrieving Cut Method from external library." set message "$message \n ASCII Data File: $asc_file_name" set message "$message \n does not exist." MOM_abort "\n $message" } # # Get the Machining Mode # set dbc_machine_mode [ASC_ask_att_val MODE $db_row "" 0 flag] # # Get the Cut Method Name # set dbc_name [ASC_ask_att_val NAME $db_row "" 0 flag] } #------------------------------------------------------------------------ proc DBC_write { } { #------------------------------------------------------------------------ global asc_database_name set asc_database_name "cut_methods.dat" ASC_write } #--------------------------------------------------------------------- proc ASC_output_header { fileid } { #--------------------------------------------------------------------- global dbc_attr_count global dbc_attr_aliases global dbc_attr_id global dbc_logname set daytime [clock seconds] set out_daytime [clock format $daytime -format "%a %b %d %Y %I:%M %p"] set headerMessage "# CUT_METHODS.DAT ########################################################################## # # PURPOSE: # # This is the database file used for defining Cut Method in # Machining method. The library reference is used for Feeds and # Speeds Specifications. # # # REVISED: # $dbc_logname $out_daytime # ########################################################################## ########################################################################## ## ## The following key words for Attribute ids are defined ## ## LIBREF cutmthd_libref - Unique record identifier (Library Reference) ## MODE machine_mode - Machine mode - MILL ## - DRILL ## - LATHE ## NAME name - Name of Cutting Method ## (appears on the label in method view) ######################################################################### # --------+-------------------------------+---------------------" puts $fileid "$headerMessage" # load the database structure DBC_load_rset_data # output FORMAT line set format_line "FORMAT" for {set i 0} {$i < $dbc_attr_count} {incr i} \ { DBC_ask_attr_id $dbc_attr_aliases($i) set format_line "$format_line $dbc_attr_id" } puts $fileid $format_line puts $fileid "#--------------------------------------------------------------------------------" } proc DBC_ask_library_values {} \ { global dbc_libref global dbc_db_ids_count global dbc_db_ids global dbc_event_error global asc_file_name global asc_units global dbc_return_status global dbc_db_ids_value # Do not change this string set NO_MATCH "No matching record found for $dbc_libref in $asc_file_name" set dbc_return_status 0 # # Look for the desired libref from the file directly # set found [ASC_file_find_object_by_att $asc_file_name $asc_units(unknown) \ LIBRF $dbc_libref db_row] # # and set the desired values # if {$found == 1 || $found == 2} { set dbc_event_error $NO_MATCH set dbc_return_status 1 } else { for { set inx 0 } { $inx < $dbc_db_ids_count } { incr inx } \ { set dbc_db_ids_value($dbc_db_ids($inx)) \ [ASC_ask_att_val $dbc_db_ids($inx) $db_row "" "" flag] } } }