Ресурсы Unigraphics: МОМ функции. |
Не много отвлечемся и я вам расскажу о том, как и где создаются MOM (TCL) расширения. Основную роль в этом играют библиотеки, libcamsmom.dll, libcamsint.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))
В исходниках 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::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 }
Пример цикла обхода всех членов в программе в поисках нужного инструмента, используя язык запросов QRY: [MOM_cycle_objects {TOOL
QRY='[$mom_tool_name] &= [^T.*$] &&[$mom_tool_diameter] > [0.5]' Синтаксис QRY (запросов): QRY='relational_exp logical_oprelational_exp . . .'
|
||||||||||||||||||
"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" | |||||||||||||||||||
} |
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_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_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-х переменных.
|
} |
libcams |
|
protected:
virtual void UGS::UI_WIZD::add_funcs_to_xlator(void *this) { UGS::MOM_INFO::add_funcs_to_xlator(void);
"WIZD_edit_object" |
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 че