Ресурсы Unigraphics: МОМ функции.

MOM функции.

   Не много отвлечемся и я вам расскажу о том, как и где создаются MOM (TCL) расширения. Основную роль в этом играют библиотеки,  libcamsmom.dlllibcamsint.dll и libcams.dll. Основные классы описаны в библиотеке - libcamsint.dll и libcamsmom.dll. Их иерархию - я не знаю. Строго говоря, подготовка и обработка данных для постпроцесса состоит из нескольких частей: первая часть это функции MOM_POST_*, вторая часть из более современной - классы. Каждый из них содержит огромное количество методов и свойств, некоторые дополняются своими специфическими. Ниже привожу их как пример (часть) методы класса UGS::TCL :

public: 
protected:
::ask_output_directory(void)
::ask_output_buffer(void)
::ask_proc_names(char const *)
::clear_end_buffer(void)
::close_output_file(char *)
::do_internal_event(char *)
::does_handler_handle_event(char *)
::dump(int (__cdecl*)(char const *,...))
::eval_boolean(char const *)
::eval_interp_proc_arg(char const *)
::eval_num_expr_in_xlator(char *,double *,int *)
::eval_str_expr_in_xlator(char *,char *,int *)
::init(void)
::implement_unload(void)
::implement_destroy(void)
::init_output_buffer(void)
::load_default_handlers(void)
::load_definition_file(void)
::load_event_handlers(void)
::load_global_vars_into_xlator(void)
::parser_error(char *,int,char *,char *)
::raise_warning(char const *)
::remove_var(char *)
::set_associative_array(char const *,char const *,char const *)
::set_dbl_array(char *,int,double *)
::set_dbl_array_2d(char *,int,int,double *)
::set_debug_mode(int)
::set_double(int,char const *,double)
::set_int(char *,int)
::set_int_array(char *,int,int *)
::set_integer(int,char const *,int)
::set_internal_string(char *,char *)
::set_last_result(char *)
::set_last_result_from_interp(void)
::set_channel_being_postprocessed(class UGS::XTP_channel *) ----xtp
::set_postprocessing_mode(bool) ------xtp
::set_str_array(char *,int,char * *)
::set_string(char *,char *)
::set_double_fast(enum MOM_FAST_VARS_e,double)
::set_int_fast(enum MOM_FAST_VARS_e,int)
::set_string_fast(enum MOM_FAST_VARS_e,char const *) 
::set_timing_group(int)
::set_unprefixed_var(char const *,char const *)
::start_translator(void)
::stop_translator(void)
::unload(void)
::unload_definition_file(void)
::write_definition_file(void)
::write_obuf_to_ofile(void)

static class UGS::OM::AttributeId 
::start_bufferAttId
::symbol_tableAttId
::time_stampAttId
::timing_groupAttId
::xtpTransAttId
::primary_output_file_nameAttId
::previous_xtp_eventAttId

Иерархия классов примерно такая :

Сами MOM-функции создаются в методе класса ::add_funcs_to_xlator(void *this)

А вот присоединяются непосредственно к командам TCL посредством структуры: struct TCL_vtbl_s * pvtbl_tcl  - со смещением 17. Что за команда TCL скрыта под этим номером можно только догадываться.

....
(*(void (__cdecl **)(int, _DWORD, int (__cdecl *)(int, int, int, int), int, _DWORD))
    ((void (__cdecl **)(_DWORD, _DWORD, _DWORD, _DWORD, _DWORD))pvtbl_tcl+ 17))
 Если Вы хотите узнать какие именно процедуры (Ваши\не Ваши) загружаются и используются в интерпретаторе, то используйте Tcl команду в событии [end_of_program]:
  set s [ info commands ]
  MOM_output_to_listing_device $s

В исходниках UG - файлы, отвечающие за МОМ, расположены примерно здесь:

/src/cams/no/ind/    
  mom_post_tclex.c  - создание MOM - команд 
  mom_doc.c  
  mom_doc_definitions.c  
  mom_post.c  - основной  файл MOM
  mom_post_convert_point.c  - конвертирует \ поворачивает точку, проверяет лицензию
  mom_post_dh_kinematics.c   - ведет расчет и выводит точки
  mom_post_kinematics.c  
  mom_post_syscycle.c  
  mom_post_turbo_cbs.c  - отвечает за режим TURBO 
  mom_post_ytab.c  
  opr_mom.c   - создает MOM - переменные для параметров операций
  opr_mom_doc.c   - создает MOM - переменные для параметров операций для Shop
     

 

Методы классов.

Рассмотрим их, по мере создания и подключения.

libcamsint.dll - libcamsmom.dll

UGS::MOM_TCL

UGS::MOM_TCL::add_funcs_to_xlator(this)
{
"MOM_output_text"   MOM_output_text <literal> {BUFFER}
Команда выводит строку исключая нумерацию кадров.
"MOM_output_literal"   MOM_output_literal ''string'' {BUFFER}
 Команда выводит строку. Если указан параметр BUFFER, то строка переноситься в выходной буфер.
"MOM_ask_event_type"  Возвращает название текущего события. Последнего события который сгенерировал генератор событий.
"MOM_ask_ess_exp_value"  MOM_ask_ess_exp_value <variable_name>
-
возвращает значение переменной variable_name модуля Expression
"MOM_abort"  MOM_abort <message>
 
Функция прерывает постпроцесс посредством ERROR_raising() в случае возникновения ошибки.
До NX4 сообщение выводилось как диалоговое окно, после, возможность его прочитать можно только в log-файле.
"MOM_display_message"  NX9  MOM_display_message <message> <title> <type> [<button1>][<button2>][<button3>]
 Показывает диалоговое сообщение в NX, где <type> это тип выводимого сообщения  I|E|W|Q,  I - информация, E - ошибка, W - предупреждение, Q - вопрос. Функция возвращает номер выбранной кнопки (1, 2, или 3).
"MOM_log_message"  MOM_log_message <message>
- записывает сообщение в syslog - файл
"MOM_run_user_function"  MOM_run_user_function <shared_library_name> <entry_point_name>
Функция загружает и подключает к MOM внешнюю программу dll\so.
"MOM_output_to_listing_device"  MOM_output_to_listing_device <''string''>
В случае интерактивной работы выводит "строку" в листинг NX
"MOM_do_template_file"  MOM_do_template_file   <file>
- процедура загружает и выполняет файл шаблона *.
tpl
"MOM_cycle_objects"

 Обход обьектов

MOM_cycle_objects

   {object_type keyword=string keyword=string 

       {object_type keyword=string keyword=string …

           {object_type keyword=string keyword=string …

                {...

                }

           }

       }

   }

object_type = { SETUP, PROGRAMVIEW, GEOMVIEW, METHODVIEW, MACHVIEW, MEMBERS, OPER, TOOL }

  • [ MOM_cycle_objects { SETUP { PROGRAMVIEW { MEMBERS { TOOL } } } } ]

 Пример цикла обхода всех членов в программе в поисках нужного инструмента, используя язык запросов QRY:

[MOM_cycle_objects

       {TOOL

        QRY='[$mom_tool_name] &= [^T.*$] &&[$mom_tool_diameter] > [0.5]'
       }
]

Синтаксис QRY (запросов):

QRY='relational_exp logical_oprelational_exp . . .'

Operator

Definition

>

greater

>=

greater or equal

<

less

<=

less or equal

==

equal

!=

not equal

&=

string equal

&!

string not equal

"MOM_open_output_file"  MOM_open_output_file <filename>
 - открывает файл на запись, если уже существует - дополняет
"MOM_close_output_file"  MOM_close_output_file <filename>
 - закрывает файл
"MOM_restart_upon_return"

 - очень интересная процедура, однажды описанная в документации Юга 16-версии, после исчезнувшая.
Указывает генератору событий перезапустить себя немедленно после выполнения текущего события. Рестарт с первого события.
Но как я не бился, эффекта от неё не было.

"MOM_dump"  MOM_dump <syslog | stdout>
 - функция сбрасывает дамп чего-то в syslog или stdout.
 Чтобы посмотреть чего, поставьте в постпроцессор в одну из процедур MOM_dump syslog  и после окончания процессирования посмотрите в Лог-файл Unigraphics. Можете включить режим отладки MOM_set_debug_mode.
"MOM_evaluate_arg"  MOM_evaluate_arg <arg>
команда аналогична tcl команде eval.
"MOM_set_debug_mode"  MOM_set_debug_mode <ON | OFF>
вкл\выкл режима отладки
"MOM_ask_env_var"  MOM_ask_env_var <variable name>
команда возвращает значение переменной окружения
"MOM_ask_part_units"  - процедура  при использовании в постпроцессоре возвращает  metric или english в зависимости от того какую метрическую  единицу вы выбрали для файла модели.
"MOM_add_to_line_buffer"  MOM_add_to_line_buffer <start|end> <value>+
Добавляет строку в конец\начало выводимой буферной строки
"MOM_remove_file"  MOM_remove_file <file> - удаляет файл
"MOM_ask_library_attributes"  MOM_ask_library_attributes <LIBRARY_KEY> <libref> <db_alias>+
 Возвращает атрибуты из специальной библиотеки.
<
library key> строка в конфигурационном CAM-файле для библиотеки.
<db_alias> может быть найден в файле описания библиотеки.
Возвращаемые элементы помещаются в массив $mom_lib_attr_value.
Пример :
 global mom_lib_attr_value mom_libref
 MOM_ask_library_attributes LIBRARY_TOOL $mom_libref Type SubType
 MOM_output_literal "Type = $mom_lib_attr_value(Type)”
 MOM_output_literal "SubType = $mom_lib_attr_value(SubType)”
"MOM_source"  MOM_source <file> 
Загружает файл\скрипт в интерпретатор, имеет почти тот же самый эффект, что source.
"MOM_ask_unique_filename"  - возвращает уникальное  (случайное) имя файла.
Аналогична С-функциям:
  tempnam <STDIO.H>
    char *tempnam(char *dir, char *prefix)
или
   mktemp <DIR.H>
     char *mktemp(char *template);
"MOM_load_and_pass_interp"  MOM_load_and_pass_interp <loading_library> <entry_point>
 
 - судя по названию и передаваемым параметрам, данная команда должна создавать подчиненный интерпретатор. Но сколько я не бился, у меня не получилось. То требует неизвестные точки входа, то не нравиться точка входа, то нет библиотек...
"MOM_load_tk"  MOM_load_tk <shared_library> <entry_point>
MOM_load_tk needs UGII_CAM_AUXILIARY_DIR to be defined
 UGII_TCL_UI_SCRIPTS_DIR UGII_TCL_UI_SHLIB ug_tcl_ui.dll
 cannot merge %s with %s for shlib name Tk_Init
 - это старая задумка гениев из UGS, они хотели в папке auxiliary разместить библиотеку ug_tcl_ui.dll = tk81.dll для того, чтобы на всю катушку использовать возможности Tk.
"MOM_unload_library"     MOM_unload_library <shared_library>
 - в документации не описана, но активно используется. Выгружает из памяти dll - библиотеку. Но не факт, смотря с какими параметрами вы её собрали.
"MOM_set_visible_undo_mark"  
"MOM_set_invisible_undo_mark"  
"MOM_undo_to_mark_by_name"  
"MOM_undo_to_mark_by_mark_id"  
"MOM_delete_to_mark_by_name"  
"MOM_delete_to_mark_by_mark_id"  
"MOM_string_toupper" NX4  - тот же самый эффект, что и TCL функция string toupper. Но имеет ряд расширений для спец символов. До версии NX4 была не документирована, хотя появилась в кодах NX1.
"MOM_set_xtp_event"  
"MOM_manage_xtp_events_in_post"  
"MOM_abort_event"  MOM_abort_event <message>
 Эта команда немедленно прерывает выполнение текущего события и возвращает управление в NX.
"MOM_ask_syslog_name" set syslog [MOM_ask_syslog_name]
- команда возвращает имя файла - syslog текущей сессии
"MOM_ask_clear_plane"  
}

 

UGS::MOM_INFO

libcamsint.dll - libcamsmom.dll

UGS::MOM_INFO::add_funcs_to_xlator(void *this)
{
   UGS::MOM_TCL::add_funcs_to_xlator(void) ;  
"MOM_set_attribute"  NX9  MOM_set_attribute <name of the object> <attribute title> <array holding the attribute information>
 - процедура устанавливает атрибут в объект. Объект должен сущестовать.
Пример:
 global attrInfoArray
 set attrTitle "POST_OUTPUT_FILE"
 set attrInfoArray(VALUE) $ptp_file_name
 set attrInfoArray(TYPE) "String"
 MOM_set_attribute $mom_operation_name $attrTitle attrInfoArray
 
"MOM_get_attribute"  NX9  MOM_get_attribute <name of the object> <title_attribute> <array holding the attribute information>
 - процедура получает атрибут объекта. Атрибут должен существовать. ( Для проверки существования используйте
MOM_get_all_attribute_titles )
Пример:
 global attrInfoArray
 set attrTitle "POST_OUTPUT_FILE"
 catch {
MOM_get_attribute $mom_operation_name $attrTitle attrInfoArray }
 if [ info exists $
attrInfoArray(VALUE) ] {  puts "VALUE=$attrInfoArray(VALUE)" ; }
 if [ info exists $
attrInfoArray(TYPE) ] {  puts "TYPE=$attrInfoArray(TYPE)" ; }
 
"MOM_remove_attribute"  NX9  MOM_remove_attribute <name of the object> <title_attribute>
- процедура удаляет атрибут в объекте. Атрибут должен существовать. ( Для проверки существования используйте MOM_get_all_attribute_titles )
Пример:
 set attrTitle "POST_OUTPUT_FILE"
 catch {
MOM_remove_attribute $mom_operation_name $attrTitle }
 
"MOM_get_all_attribute_titles"  NX9  MOM_get_all_attribute_titles <name of the object> <array holding the attribute titles>
- процедура получает имена всех атрибутов объекта в виде массива.
Пример:
 global  attrTitles
 MOM_get_all_attribute_titles
$mom_operation_name  attrTitles
 if [ array exists attrTitles ] {
     foreach i [ array names attrTitles ] {
  
      puts "$i ) = $attrTitles($i)" ;
 
    }
 }
}

 

 UGS::DBC  UGS::LIB  UGS::QRY

UGS::DBC::add_funcs_to_xlator(void *this)
{
         UGS::MOM_TCL::add_funcs_to_xlator();  
"DBC_write_to_rset"  
"DBC_ask_attr_id"  
"DBC_load_rset_data"  
"DBC_set_definition_file_data"  
"DBC_strip_prefix_from_path"  
"DBC_ask_db_ess_prefix_suffix"  
"DBC_connect_to_genius"  
"DBC_disconnect_from_genius"  
"DBC_set_user_defined_str_attr"  
"DBC_read_from_rset"  
"DBC_ask_option_value"  
"DBC_is_attr_in_rset"  
}

 

libcams.dll
UGS::MOM_DOC
UGS::MOM_DOC::add_funcs_to_xlator(void *this)
{
       UGS::MOM_INFO::add_funcs_to_xlator();  
"MOM_list_oper_path"  MOM_list_oper_path <operation_name> <event_handler> <definition_file> <output_file>
Команда выводит листинг операции. И позволяет выбрать формат листинга.
Эта команда позволяет Вам постпроцессировать операцию используя существующий постпроцессор (Tcl и Def файл). Вы можете выводить или машинный код G\M, или список UDEs
Пример: вывод листинга операции в CLSF-формате.
set list_tcl [MOM_ask_env_var UGII_CAM_TOOL_PATH_DIR]clsf.tcl
set list_def [MOM_ask_env_var UGII_CAM_TOOL_PATH_DIR]clsf.def
MOM_list_oper_path $mom_operation_name $list_tcl $list_def
"MOM_load_oper_ude_exps" NX9  
"MOM_list_user_defined_events"  MOM_list_user_defined_events < Start/End > < operation_name > <Definition file> <Event_handler> [<output>]
Это расширение позволяет выводить список UDEs определенных в операции.
"Start" - список начальных UDE, "End" - конечные
Пример:
MOM_list_user_defined_events "Start" $mom_operation_name \
"$mom_source_directory\\test_info.def" "$mom_source_directory\\test_info.tcl" "c:\\Temp\\XYZ.txt"
"MOM_refresh_display"  мом - функция  по обновлению экрана, для вывода рисунка в документации.
"MOM_capture_image"  судя по названию функция делает захват изображения с окна UG, используются технологии VRML GIF
"MOM_capture_path_gif_image" NX9   MOM_capture_path_gif_image <opr_name> [<output>]
 - позволяет выбрать путь\папку куда сохранять gif-файлы [tool path] операции.
}

 

Но классы описанные в библиотеке выше являются более общными для всех, а вот непосредственно отвечающими за обработку и вывод постпроцессора являются классы лежащие внутри ниже показанной библиотеки.

libcams.dll
UGS::MOM_POST
virtual void UGS::MOM_POST::add_funcs_to_xlator(void)
{
 UGS::MOM_INFO::add_funcs_to_xlator();  
"MOM_force"  MOM_force <Always | Once | Off > <Address_1 ... Address_n>
 - функция устанавливает модальность вывода адресов.
"MOM_suppress" MOM_suppress <Always | Once | Off > <Address_1 ... Address_n>
 - функция подавляет вывод адресов
"MOM_do_template"  MOM_do_template <template_name> {BUFFER | CREATE}
 функция возвращает строку созданную как результат <template name>.
"MOM_reset_sequence"  MOM_reset_sequence <start> <increment> {frequency}
"MOM_force_block"  MOM_force_block <Always | Once | Off > <Block_1 ... Block_n>
- функция устанавливает модальность вывода блоков
"MOM_set_seq_on"  Включает нумерацию, если SEQUENCE спецификатор определен в def-файле. Возвращает: on\off
"MOM_set_seq_off"  Выключает вывод нумерации кадра.
"MOM_ask_address_value"  MOM_ask_address_value <address name>
 - Возвращает значение выводимого адреса <address name> (всегда в абсолюте)
"MOM_set_line_leader" MOM_set_line_leader <Always | Once | Off > <''string''>
"MOM_incremental"  MOM_incremental <ON | OFF> <Address_1 ... Address_n>
"MOM_load_definition_file"  MOM_load_definition_file <filename>
 - загружает def-файл. Если данные в файле (или любого из включаемого) совпадают с уже загруженными, то дубликат будет перезаписан новой версией.
"MOM_set_address_format"  MOM_set_address_format <Address Name> <Format Name>
 Эта функция переопределяет формат выводимых адресов  <Address Name> как <Format Name>.
<Format Name>
должен быть определен в def-файле.
"MOM_set_output_style"  
"MOM_add_to_block_buffer"  MOM_add_to_block_buffer <block name> <start|end> <value>+
"MOM_add_to_address_buffer"  MOM_add_to_address_buffer <address name> <start|end> <value>+
"MOM_reload_kinematics"  Обновляет генератор событий текущими значениями всех кинематических переменных.
"MOM_reload_variable" MOM_reload_variable [-a] variable_name
- обновляет генератор новыми значениями. Ключ -a для массива.
"MOM_set_format"     MOM_set_format  <address name> <format>
 - функция устанавливает формат вывода адреса.
  Например: MOM_set_format  
X "%.3f"
Аналогична "MOM_set_address_format"
"MOM_ask_end_of_line_state"  
"MOM_set_end_of_line_state"  
"MOM_map_local_csys_to_main"  
"MOM_disable_address" NX4  MOM_disable_address <Address>
Подавляет вывод всех адресов.
MOM_force ONCE
, MOM_force ALWAYS - игнорируются пока MOM_disable_address активна.
MOM_enable_address
отменяет действия
MOM_disable_address.
"MOM_enable_address" NX4  MOM_enable_address <Address>
 
Восстанавливает выходной статус адресов, которые были изменены MOM_disable_address. Возвращает выходной статус начального состояния.
"MOM_validate_machine_model"  ISV
"MOM_reload_iks_parameters"  
"MOM_start_subroutine"  ISV
"MOM_end_subroutine"  ISV
"MOM_update_kinematics"  Функция обновляет ниже указанные переменные с общей системой кинематики. Возвращает : 1 или 0.
  • mom_kin_4th_axis_center_offset
  • mom_kin_5th_axis_center_offset
  • mom_kin_pivot_gauge_offset
"MOM_abort_operation"  
"MOM_ask_mcs_info"  
"MOM_set" NX9  
"MOM_unset" NX9  
"MOM_link_var" NX9  
"MOM_unlink_var" NX9  
"MOM_ask_machine_zero_junction_name"  Команда возвращает название MACHINE_ZERO Junction.
Пример: set jct_name [MOM_ask_machine_zero_junction_name]
Также результат сохраняется в переменную
mom_sim_result
"MOM_ask_init_junction_xform"  MOM_ask_init_junction_xform <jct_name> 
Команда возвращает матрицу трансформаций
 1) mom_sim_result (matrix: list of 9)
 2)
mom_sim_result1 (origin: list of 3)
 
"MOM_define_csys_matrix"  
"MOM_revise_current_csys_matrix"  
"MOM_skip_handler_to_event"  MOM_skip_handler_to_event <event or motion-type>
- команда пропускает выполнение событий из генератора до появления задаваемого события. Каждое начало операции {start-of-path} обнуляет условие.
motion-type =
{ Engage, Approach, Firstcut, Retract, Return, Rapid, Cut, Stepover, Departure, Traversal, Sidecut, From, Gohome, Cycle}
Часто употребляется с ниже указанной MOM-командой.
"MOM_load_lathe_thread_cycle_params" Эта команда загружает параметры цикла нарезания резьбы из текущей операции. Возвращает 1 в случае успеха.
Ex: if { [MOM_load_lathe_thread_cycle_params] } { # Do your thing... }
"MOM_run_postprocess" NX9  MOM_run_postprocess <event-handler Tcl file> <definition file> <output file>
 Запускает разделенный постпроцесс с другим постпроцессором в той же самой операции или программе.
Возвращает:
 1 - если процесс выполнен успешно,
 2 - если в процессе выполнения появились ошибки,
-1 - если пост вызывает сам себя.
"MOM_set_env_var" NX9  MOM_set_env_var <name> <value>
Определяет переменную окружения NX. Только новые переменные могут быть установлены. В случае успеха возвращает 1, иначе 0.
В течении сессии могут быть созданы только 20 таких переменных.
"MOM_check_out_license" NX9  MOM_check_out_license <license>
 - Получает Flexlm лицензию до конца работы.<license> - название валидной лицензии. Возвращает 1 в случае успеха, или 0.
Только 20 лицензий могут быть проверены в текущей сессии.
"MOM_convert_point" NX9  MOM_convert_point <point> <vector>
 - Конвертирует <точку> из позиции инструмента MCS в машинную систему координат . <point> и <vector> массивы[3].
  • mom_result - массив[X, Y, Z, 4th, 5th] - первичное решение
  • mom_result1 - массив[X, Y, Z, 4th, 5th] - альтернативное
"MOM_post_oper_path" NX9 MOM_post_oper_path <operation-name> [<output file>] [<postprocessor>] [ <event-handler Tcl file> <definition file>]
 Выполняет пост-процесс заданной операции.
Возвращает:
 1 (True) если выполнение успешно
 0 (False) если есть ошибки.
-1 если пост вызывает сам себя.
После выполнения создается переменная mom_post_oper_path=1.
"MOM_ask_oper_csys"  MOM_ask_oper_csys <operation-name>
 Возвращает CSYS информацию операции в 3-х переменных.
  • mom_result = mom_special_output { 0 = None, 1 = Use Main MCS, 2 = Fixture Offset, 3 = CSYS Rotation}.
  • mom_result1 = mom_csys_matix[12]
  • mom_result2 = mom_machine_csys_matrix[12].
}

 

Класс UGS::UI_WIZD.

libcams

 protected: virtual void UGS::UI_WIZD::add_funcs_to_xlator(void *this)
{
     UGS::MOM_INFO::add_funcs_to_xlator(void);

"WIZD_edit_object"
"WIZD_set_object_param"
"WIZD_ask_object_param"
"WIZD_generate"
"WIZD_set_geometry_by_name"
"WIZD_set_mcs_by_name"
"WIZD_set_mcs_by_attribute"
"WIZD_set_geometry_by_attribute"
"WIZD_set_geometry_by_attribute_query"
"WIZD_set_clearance_plane_by_name"
"WIZD_set_clearance_plane_by_attribute"
"WIZD_set_wedm_move_control_point"
"WIZD_move_to_program_none"
"WIZD_delete_object"
"WIZD_ask_user_attribute"
"WIZD_set_ont_view"
"WIZD_refresh_ont"
"WIZD_generate_program"
"WIZD_ask_setup_program"
"WIZD_display_warning"
"WIZD_create_feature_groups"
"WIZD_delete_empty_feature_groups"
"WIZD_optimize"
"WIZD_output_shop"
"WIZD_output_machine"
}

 

 

MOM_SIM={событие| 1-этап: методы MOM_SIM, 2 этап: методы  MOM_POST }

libcamssimint.dll - libcamssim.dll

 UGS::MOM_SIM::add_funcs_to_xlator(void *this)
{
     UGS::MOM_POST::add_funcs_to_xlator();
    return MOM_SIM::add_spec_funcs_to_tcl(this);
}

int MOM_SIM::add_spec_funcs_to_tcl(void *this)
{
"SIM_mount_kim_comp",
"SIM_unmount_kim_comp",
"SIM_mount_tool",
"SIM_unmount_tool",
"SIM_load_workpiece",
"SIM_unload_workpiece",
"SIM_move_linear_axis",
"SIM_move_rotary_axis",
"SIM_set_parameter",
"SIM_feedback_message",
"SIM_play_sound",
"SIM_set_feed",
"SIM_set_speed",
"SIM_set_coolant",
"SIM_set_cutting_mode",
"SIM_set_machining_mode",
"SIM_update",
"SIM_step",
"SIM_set_channel",
"SIM_reset_buffer",
"SIM_start_of_simulation",
"SIM_end_of_simulation",
"SIM_mtd_init",
"SIM_mtd_reset",
"SIM_ask_cording_tol",
"SIM_transform_offset_acs_to_mtcs",
"SIM_transform_matrix_acs_to_mtcs",
"SIM_msg_user_feedback",
"SIM_activate_tool",
"SIM_ask_kim_comp_name_by_id",
"SIM_ask_tool_offsets",
"SIM_ask_junction_xform",
"SIM_ask_init_junction_xform",
"SIM_create_junction",
"SIM_delete_junction",
"SIM_ask_is_junction_exist",
"SIM_set_current_zcs_junction",
"SIM_ask_mtd_units",
"SIM_set_mtd_units",
"SIM_ask_axis_position",
"SIM_dialog_set_item",
"SIM_ask_mtcs_junction",
"SIM_ask_axis_dof_junction",
"SIM_ask_axis_limits",
"SIM_delay",
"SIM_ask_is_junction_dependent",
"SIM_dbg_start",
"SIM_dbg_end",
"SIM_dbg_write_message",
"SIM_dbg_set_output",
"SIM_msg_nc_command",
"SIM_ask_status_send_nc_command_msg",
"SIM_set_status_send_nc_command_msg",
"SIM_set_axis_rotary_dir_mode",
"SIM_ask_axis_rotary_dir_mode",
"SIM_set_axis_allow_reversal",
"SIM_ask_axis_is_reversal_allowed",
"SIM_ask_comp_from_dof",
"SIM_find_comp_by_name",
"SIM_ask_nc_axes_of_mtool",
"SIM_msg_program_mark",
"SIM_set_immediate_update",
"SIM_ask_immediate_update",
"SIM_convert_nurbs_to_position_data",
"SIM_set_coolant_any",
"SIM_set_linear_axes_config",
"SIM_set_rotary_axes_config",
"SIM_ask_linear_axes_config",
"SIM_ask_rotary_axes_config",
"SIM_set_current_ref_junction",
"SIM_ask_current_ref_junction",
"SIM_ask_current_zcs_junction",
"MOM_SIM_ask_last_position",
"MOM_SIM_move_linear_zcs_or_mtcs",
"MOM_SIM_move_circular_zcs_or_mtcs",
"SIM_mach_max_axis_rapid_velocity",
"SIM_assign_channel_to_spindle",
"SIM_mach_assign_channel_to_spindle",
"SIM_mach_assign_axis_to_channel",
"SIM_mach_default_primary_channel",
"SIM_set_spindle_speed",
"SIM_set_max_spindle_speed",
"SIM_mach_max_spindle_speed",
"SIM_mach_default_spindle_speed",
"SIM_set_surface_speed",
"SIM_synchronize",
"SIM_primary_channel",
"SIM_set_xtp_event",
"SIM_ask_xtp_duration",
"SIM_set_linearization",
"SIM_set_interpolation",
"SIM_ask_zcs_comp_name",
"SIM_ask_nc_axis_name",
"SIM_ask_tool_mount_jct_name",
"SIM_ask_tool_mount_comp_name",
"SIM_ask_head_pivot_jct_full_name",
"SIM_ask_machine_base_component",
"SIM_ask_number_of_child_components",
"SIM_ask_nth_child_component",
"SIM_ask_axis_of_component",
"SIM_ask_id_of_component",
"SIM_ask_holding_systems_of_pocket",
"SIM_is_component_of_system_class",
"SIM_is_component_of_user_class",
"SIM_ask_number_of_junctions",
"SIM_ask_nth_junction",
"SIM_is_junction_of_system_class",
"SIM_ask_number_of_channels",
"SIM_ask_nth_channel",
"SIM_ask_number_of_channels_at_component",
"SIM_ask_nth_channel_at_component",
"SIM_ask_base_device_holder_of_comp",
"SIM_ask_base_device_of_comp",
"SIM_ask_axis_initial_value",
"SIM_set_implicit_update",
"SIM_set_axis_rapid_velocity",
"SIM_normalize_rotary_axis",
"SIM_ask_facet_tol",
"SIM_ask_insp_base_device_holder_of_comp" ;
}
 

    В библиотеках Юниграфики, собственно за обработку данных координат (для постпроцессора) отвечает большое количество функций с именем: MOM_POST_*. В их теле происходит интенсивная обработка mom-переменных, переменных - кинематики, разного рода вычисления. Вот примерные имена их:

.........
MOM_POST_convert_point
MOM_POST_edm_4axis_pt
MOM_POST_rotate_tool_axis
MOM_POST_convert_5axis_pt
MOM_POST_dh_convert_point
MOM_POST_round
MOM_POST_rotary_pos
MOM_POST_rotate_point
MOM_POST_limit_angle
........

- на них, я не буду останавливаться. Их много, а тратить время на их анализ просто не хотелось, кто хочет - может попробовать сам. Покажу только список всех кинематических переменных читаемых функцией MOM_POST_init_kinematic_data. В этой функции MOM читает мом-переменные и заполняет сложную внутреннюю структуру. Все значения приводятся к верхнему регистру MCE_convert_toupper(char *), а затем сравниваются с определенными значениями. Активно применяется PART_ask_units. Внутри функции читается переменная "UGII_CAM_POST_ENABLE_RESOLUTION_ROUND" - за что она отвечает можно только догадываться. Практически все строковые кинематические MOM переменные переводятся в числовые {1, 0}={TRUE,FALSE}, либо в массив значений.

void MOM_POST_init_kinematic_data(class UGS::MOM_POST *)NX9
{
    
 "kin_cycle_plane_change_to_lower" ; "TRUE"
 "kin_cycle_plane_change_per_axis" ; "TRUE"
 "kin_output_unit" ; IN or MM
 "kin_post_data_unit" ; IN or MM
 "kin_machine_type" ; 
"lathe" "3_axis_mill" "4_axis_head" "4_axis_table" 
"mill_turn" "3_axis_mill_turn" 
"5_axis_dual_table" "5_axis_dual_head" "5_axis_head_table" 
"2_axis_wedm" "4_axis_wedm"

 "kin_wire_tilt_output_type" ; ANGLES, COORDINATES
 "kin_min_angular_incr" ; "COORDINATES" "ADVANCED"
 "kin_machine_resolution"
 "kin_min_arc_length"
 "kin_track_center_of_ball" ; "TRUE"

 "kin_4th_axis_plane" ;"ZX"
 "kin_4th_axis_rotation" ;"reverse" STANDARD
 "kin_4th_axis_min_incr"
 "kin_4th_axis_min_limit"
 "kin_4th_axis_max_limit"
 "kin_4th_axis_zero"
 "kin_4th_axis_center_offset"
 "kin_4th_axis_direction" ; 
"SIGN_DETERMINES_DIRECTION" "SIGN_PLUS_CCLW" "CCLW_LARGER_ANGLE" 
"ALWAYS_CLW" "ALWAYS_CCLW" "ALWAYS_SHORTEST" "CODE_FORCES_DIR"

 "kin_linearization_tol"
 "kin_linearization_flag" ;"TRUE"

 "kin_5th_axis_plane" ;"ZX"
 "kin_5th_axis_rotation"; "reverse" STANDARD
 "kin_5th_axis_min_incr"
 "kin_5th_axis_min_limit"
 "kin_5th_axis_max_limit"
 "kin_5th_axis_zero"
 "kin_5th_axis_center_offset"
 "kin_5th_axis_inclination_to_4th"
 "kin_5th_axis_direction" ; 
"SIGN_DETERMINES_DIRECTION" "MAGNITUDE_DETERMINES_DIRECTION" "SIGN_PLUS_CCLW" 
"CCLW_LARGER_ANGLE" "ALWAYS_CLW"; "ALWAYS_CCLW" "ALWAYS_SHORTEST" "CODE_FORCES_DIR"

 "kin_iks_usage"
 "iks_usage"

 "kin_4th_axis_plane"
 "kin_5th_axis_plane"

 "kin_pivot_dist_vec"
 "kin_pivot_gauge_offset"

 "kin_coordinate_type" ; "POLAR"

  ;POSX, POSY, POSZ, NEGX, NEGY, NEGZ
 "kin_holder1_orientation" ,  "kin_holder1_offset_x" ,  "kin_holder1_offset_y" ,  "kin_holder1_offset_z"
 "kin_holder2_orientation" ,  "kin_holder2_offset_x" ,  "kin_holder2_offset_y" ,  "kin_holder2_offset_z"
 "kin_holder3_orientation" ,  "kin_holder3_offset_x" ,  "kin_holder3_offset_y" ,  "kin_holder3_offset_z"
 "kin_holder4_orientation" ,  "kin_holder4_offset_x" ,  "kin_holder4_offset_y" ,  "kin_holder4_offset_z"
 "kin_holder5_orientation" ,  "kin_holder5_offset_x" ,  "kin_holder5_offset_y" ,  "kin_holder5_offset_z"
 "kin_holder6_orientation" ,  "kin_holder6_offset_x" ,  "kin_holder6_offset_y" ,  "kin_holder6_offset_z"

 "kin_polar_radius_side" ; "POSITIVE" "NEGATIVE"

 "kin_nurbs_output_type" ; BSPLINE, HEIDENHAIN_POLY, SIEMENS_POLY

 "kin_independent_head" ; FRONT, REAR, RIGHT, LEFT, SIDE, SADDLE, NONE

 "kin_ind_to_dependent_head_x"
 "kin_ind_to_dependent_head_z"

 "kin_clsf_generation"

 "kin_no_defaults"

 "kin_read_ahead_next_motion" ;"TRUE"

 "kin_is_turbo_output" ;"TRUE" "FALSE"

 "kin_arc_output_mode" ; FULL_CIRCLE, QUADRANT, LINEAR

 "kin_helical_arc_output_mode" ;FULL_CIRCLE, QUADRANT, LINEAR, END_POINT 
 "kin_arc_valid_plane" ; XYZ, XY, YZ, ZX, ANY
 "kin_min_arc_radius"
 "kin_max_arc_radius"
 "kin_tool_tracking_height"

 "kin_rapid_feed_rate"

 "kin_max_fpm"
 "kin_max_fpr"
 "kin_max_frn"
 "kin_max_dpm"
 "kin_min_fpm"
 "kin_min_fpr"
 "kin_min_frn"
 "kin_min_dpm"
 "kin_tool_change_time"
 "kin_clamp_time"
 "kin_flush_time"
 "kin_spindle_axis" ;"XAXIS" "YAXIS" "ZAXIS"

 "kin_4th_axis_incr_switch" ; ON (incremental) or OFF (absolute)
 "kin_5th_axis_incr_switch"

 "kin_tool_tip_distance_compute_method"

 "sys_linearization_method"; "axis"
}

 

 Если разработчикам было необходимо использовать Tcl-команду вне классов MOM, то они используют справа показанную функцию.

  void MOM_TCL_add_ui_funcs_to_tcl(class UGS::MOM_TCL *)
  {
     "MOM_display_message"
     "MOM_output_to_listing_device"
   }

Основным классом можно признать UGS::MOM_TCL. Косвенным фактом этого служит обработчик по умолчанию:

 UGS::MOM_TCL::load_default_handlers(void *this) {

proc MOM__halt {} { set pfx_util_done_heading 0;}

proc MOM__util_do_heading {} {
  global pfx_part_name;
  global pfx_logname;
  global pfx_date;
  global pfx_util_done_heading;
  if { $pfx_util_done_heading == 1 } { return };
  MOM__util_print "Informational Output for PART: $pfx_part_name";
  MOM__util_print "Created By: $pfx_logname";
  MOM__util_print "Creation Date: $pfx_date";
  MOM__util_print "===============================================";
  set pfx_util_done_heading 1;
}

proc MOM__util_print_line_context {filename linenum context where} {
  set fl [open $filename r];
  set from [expr $linenum-$context];
  set to [expr $linenum+$context];
  set current 1;
  if { $from < 1 } { set from 1 };
  while { $current <= $to && [gets $fl line] >= 0 } {
   if { $current >= $from } { MOM__util_print "${current}: $line"; }
   set current [incr current];
  };
  close $fl;
}

proc MOM__util_print { line } {
  set f [open "./pfx_information.out" a];
  puts $f $line;
  flush $f;
  close $f;
}

proc MOM__boot {} { global pfx_util_done_heading; set pfx_util_done_heading 0;}
set pfx_debug_init_done 0;
set pfx_debug_events 0;
set pfx_debug_vars 0;
set pfx_debug_num_flag 0;
set pfx_debug_range_flag 0;
set pfx_debug_range_lower 0;
set pfx_debug_range_upper 0;
set pfx_debug_event_num 0;
set pfx_parse_error "";
set pfx_parse_file_name "";
set pfx_parse_line_number "";
set pfx_parse_line "";
set pfx_error_info "";
set pfx_error_code "";
set pfx_error_event "";
set pfx_error_event_handler_name "";

set pfx_parse_error "";
set pfx_parse_file_name "";
set pfx_parse_line_number "";
set pfx_parse_line "";
set pfx_error_info "";
set pfx_error_code "";
set pfx_error_event "";
set pfx_error_event_handler_name "";

proc PFX_on_event_error {} {
  global pfx_error_info;
  global pfx_error_code;
  global pfx_error_event;
  global pfx_error_event_handler_name;
  MOM__util_print "***** A TCL Error Has Occurred *****";
  MOM__util_print "Event Handler: $pfx_error_event_handler_name";
  MOM__util_print "Event: $pfx_error_event";
  MOM__util_print "Error Info: $pfx_error_info";
  MOM__util_print "Error Code: $pfx_error_code";
}

proc PFX_on_parse_error {} {
  global pfx_parse_error;
  global pfx_parse_file_name;
  global pfx_parse_line_number;
  global pfx_parse_line;
  MOM__util_print "***** A Parse Error Has Ocurred *****";
  MOM__util_print "Definition file: $pfx_parse_file_name";
  MOM__util_print "In Or Near Line Number: $pfx_parse_line_number";
  MOM__util_print_line_context $pfx_parse_file_name $pfx_parse_line_number 3 stdonly;
  MOM__util_print "Parser error message: $pfx_parse_error";
}

proc PFX_catch_warning {} {
  global pfx_warning_info;
  MOM__util_do_heading;
  MOM__util_print "";
  MOM__util_print "+++MOM WARNING+++";
  MOM__util_print "Info: $pfx_warning_info";
  MOM__util_print "";
}

proc PFX_on_event_error_debug {} {
  global pfx_error_info;
  global pfx_error_code;
  global pfx_error_event;
  global pfx_error_event_handler_name;
  MOM__util_print "";
  MOM__util_print "***ERROR***: Error in the Event Handler";
  MOM__util_print "---------------------------------------";
  MOM__util_print "Event Handler: $pfx_error_event_handler_name";
  MOM__util_print "Event: $pfx_error_event";
  MOM__util_print "Error Info: $pfx_error_info";
  MOM__util_print "Error Code: $pfx_error_code";
  MOM__util_print "";
}

proc PFX_on_parse_error_debug {} {
  global pfx_parse_error;
  global pfx_parse_file_name;
  global pfx_parse_line_number;
  global pfx_parse_line;
  MOM__util_print "";
  MOM__util_print "***ERROR***: Parse Error in the Definition File";
  MOM__util_print "--------------------------------------------------";
  MOM__util_print "Definition file: $pfx_parse_file_name";
  MOM__util_print "In Or Near Line Number: $pfx_parse_line_number";
  MOM__print_line_context $pfx_parse_file_name $pfx_parse_line_number 3 fileonly
  MOM__util_print "Line: $pfx_parse_line";
  MOM__util_print "Parser error message: $pfx_parse_error";
  MOM__util_print "";
}

proc PFX_end_debug {} { global pfx_util_done_heading; set pfx_util_done_heading 0; }

proc PFX_init_debug {} {
  global pfx_debug_init_done;
  global pfx_part_name;
  global pfx_logname;
  global pfx_date;
  global pfx_util_done_heading;
  global pfx_debug_events pfx_debug_vars pfx_debug_num_flag;
  global pfx_debug_range_flag pfx_debug_range_lower pfx_debug_range_upper;
  MOM__util_print "Set Debugging Options";
  PFX_set_defaults;
  if { [file exists mom_debug_answers] } {
    PFX_read_answers;
    MOM__util_print "Use the answers found in mom_debug_answers.";
  } else {
    MOM__util_print "Use default answers.";
  };
  MOM__util_print "Answers: $pfx_debug_events $pfx_debug_vars $pfx_debug_num_flag \
                       $pfx_debug_range_flag $pfx_debug_range_lower $pfx_debug_range_upper";
  set pfx_util_done_heading 0;
  set pfx_debug_init_done 1;
}

proc PFX_read_answers {} {
  global pfx_debug_events;
  global pfx_debug_vars;
  global pfx_debug_num_flag;
  global pfx_debug_range_flag;
  global pfx_debug_range_lower;
  global pfx_debug_range_upper;
  set f [open mom_debug_answers r];
  gets $f pfx_debug_events;
  gets $f pfx_debug_vars;
  gets $f pfx_debug_num_flag;
  gets $f pfx_debug_range_flag;
  if { $pfx_debug_range_flag == 1 } {
    gets $f pfx_debug_range_lower;
    gets $f pfx_debug_range_upper;
  };
  close $f;
}

proc PFX_set_defaults {} {
  global pfx_debug_events;
  global pfx_debug_vars;
  global pfx_debug_num_flag;
  global pfx_debug_range_flag;
  global pfx_debug_range_lower;
  global pfx_debug_range_upper;
  set pfx_debug_events 1;
  set pfx_debug_vars 0;
  set pfx_debug_num_flag 1;
  set pfx_debug_range_flag 0;
  set pfx_debug_range_lower 0;
  set pfx_debug_range_upper 0;
}

proc PFX_before_each_add_var {} {
  global pfx_debug_assign_var;
  global pfx_debug_vars;
  global pfx_debug_event_num;
  global pfx_debug_range_lower pfx_debug_range_upper pfx_debug_range_flag;
  if { $pfx_debug_vars == 0 } { return };
  MOM__util_do_heading;
  set num $pfx_debug_event_num;
  incr num;
  if { $pfx_debug_range_flag == 1 } {
    if { $num < $pfx_debug_range_lower || $num > $pfx_debug_range_upper } { return };
  };
  MOM__util_print "Var: $pfx_debug_assign_var";
}

proc PFX_before_each_event {} {
  global pfx_debug_event_name;
  global pfx_debug_events pfx_debug_range_flag pfx_debug_event_num;
  global pfx_debug_range_lower pfx_debug_range_upper pfx_debug_num_flag;
  incr pfx_debug_event_num;
  if { $pfx_debug_events == 0 } { return };
  if { $pfx_debug_range_flag == 1 } {
    if { $pfx_debug_event_num < $pfx_debug_range_lower || $pfx_debug_event_num > $pfx_debug_range_upper } { return };
  };
  MOM__util_do_heading;
  if { $pfx_debug_num_flag == 1 } { set num $pfx_debug_event_num; } else { set num ""; };
  MOM__util_print ""; 
  MOM__util_print "Event ${num}: $pfx_debug_event_name";
  MOM__util_print "--------------------------------------------------";
  MOM__util_print "";
}

}

Что делает этот код - я не знаю. Наверно он служит для каких-то отладочных мероприятий.

Подведем итоги.

Как вы можете видеть, при постпроцессировании доступны MOM-функции из 3-х классов

UGS::MOM_TCL -> UGS::MOM_INFO -> UGS::MOM_POST => пост-процесс

более того, некоторые функции слабо документированы, либо сознательно не афишируются разработчиками даже в утилите Post Builder : mom_vars_browser.tcl


Copyright © 2001—2009 че