Ресурсы Unigraphics: Создание постпроцессоров. Создание дополнительных MOM функций. |
Хотя постпроцессор, созданный на Tcl, обладает всей мощью этого языка. Возможностей Tcl, а также тех МОМ команд, которые вложили в него создатели, иногда нам разработчикам не хватает. Минусы есть. Первый из них, это ошибки в коммерческой версии 8.1, которая используется Югом. Второй минус, в скорости работы. Без всякого сомнения, компилируемый код выполняется в несколько раз быстрее, чем интерпретация скрипта. А если необходимо, что-то сделать с выводимой конечной программой размером эдак в 15 мб, то время ожидания выполнения скрипта на Tcl, может затянуться.
Когда необходимо применять\создавать
MOM - функции:
Есть несколько примеров для создания подобных расширений. Второй - это пример файла из документации по UniGraphiCS ( описание появилось лишь в документации NX4 ): uf_mom_extend. Но есть недочеты, с которыми употреблять её незя. Почему? Читайте ниже. |
|
Покажу создание данного расширения на примере. Это лучший способ показать как сделать Это.
Пусть нам необходимо расширить МОМ функции:
- я хочу написать
функцию выводящую сообщение технологу, в процессе постпроцессирования с
возможностью выбора (Да,Нет,..),
- и функцию возвращающую имя части из базы данных
Teamcenter (имя части представлено в неудобочитаемом
виде - это можно сделать на Tcl, но напишем
расширение):
|
Кстати, в NX 9
разработчики наконец ввели MOM команду: MOM_display_message <message> <title> <type> [<button1>][<button2>][<button3>] Показывает диалоговое сообщение в NX, где <type> это тип выводимого сообщения I|E|W|Q, I - информация, E - ошибка, W - предупреждение, Q - вопрос. Функция возвращает номер выбранной кнопки (1, 2, или 3).
|
Код | Комментарии |
////////////////////////////////////////////////////////////////////////////// // // pb_base_ex.cpp // // Description: // Contains Unigraphics entry points for the application. // ////////////////////////////////////////////////////////////////////////////// #define _CRT_SECURE_NO_DEPRECATE 1 |
Определяем переменную
_CRT_SECURE_NO_DEPRECATE=1 - это требование компилятора Visual Studio версий выше 7. Связано с безопасностью, для нас это не критично, просто убираем надоедливое сообщение при сборке. |
/* Include files */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <uf.h> #include <uf_exit.h> #include <uf_ui.h> #include <windows.h> #include <shellapi.h> #include <uf_mom.h> #include <uf_attr.h> #include <uf_obj.h> #include <uf_param.h> #include <uf_param_indices.h> #include <uf_cam.h> #include <uf_setup.h> #include <uf_ncgroup.h> #include <uf_oper.h> #include <uf_ugopenint.h> #include <uf_part.h> #include <uf_assem.h> #include <uf_ugmgr.h> // ------------------------------------------------------------------------------------------------------------------------------ static void PrintErrorMessage( int errorCode ); |
Включаем
необходимые заголовочные файлы. Обязательно - mom.h. Включаем windows.h - для получения доступа к API Windows, ну, если Вы используете Окна. |
/****************************************************************************/ #define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X))) static int report( char *file, int line, char *call, int irc) { if (irc) { char messg[133]; printf("%s, line %d: %s\n", file, line, call); (UF_get_fail_message(irc, messg)) ? printf(" returned a %d\n", irc) : printf(" returned error %d: %s\n", irc, messg); } return(irc); } |
Это стандартная, удачная конструкция для вывода и показа сообщений об ошибках функций. |
/****************************************************************************/ #define _ANSI_ARGS_(x) x typedef struct Tcl_Interp { char *result; /* If the last command returned a string * result, this points to it. */ void (*freeProc) _ANSI_ARGS_((char *blockPtr)); /* Zero means the string result is * statically allocated. TCL_DYNAMIC means * it was allocated with ckalloc and should * be freed with ckfree. Other values give * the address of procedure to invoke to * free the result. Tcl_Eval must free it * before executing next command. */ int errorLine; /* When TCL_ERROR is returned, this gives * the line number within the command where * the error occurred (1 if first line). */ } Tcl_Interp; /* * When a TCL command returns, the string pointer interp->result points to * a string containing return information from the command. In addition, * the command procedure returns an integer value, which is one of the * following: * * TCL_OK Command completed normally; interp->result contains * the command's result. * TCL_ERROR The command couldn't be completed successfully; * interp->result describes what went wrong. * TCL_RETURN The command requests that the current procedure * return; interp->result contains the procedure's * return value. * TCL_BREAK The command requests that the innermost loop * be exited; interp->result is meaningless. * TCL_CONTINUE Go on to the next iteration of the current loop; * interp->result is meaningless. */ #define TCL_OK 0 #define TCL_ERROR 1 #define TCL_RETURN 2 #define TCL_BREAK 3 #define TCL_CONTINUE 4 /****************************************************************************/ |
здесь я
включаю описание структуры struct Tcl_Interp взятой (выдранной) мною из исходников Tcl\Tk. а также определяем стандартные Tcl переменные #define TCL_OK 0 #define TCL_ERROR 1 #define TCL_RETURN 2 #define TCL_BREAK 3 #define TCL_CONTINUE 4 - это необходимо для возвращения нужных значений из функций в интерпретатор. Обязательно описывайте эту структуру в своей функции: static int <имя функции> ( void *client_data, /* This is the mom object */ void *interp, /* Pointer to the TCL interpreter */ int argc, /* Count of the numnber of arguments */ char **argv /* Array of arguments where the argv[0] - The TCL extension */ ) { ..... Tcl_Interp *intrp = ( Tcl_Interp *) interp ; UF_MOM_id_t mom_id = ( UF_MOM_id_t ) client_data ; ..... // устанавливаем возвращаемое значение в функцию str[0]='\0'; sprintf(str," return value = %d",response); intrp->result=str; intrp->errorLine=TCL_OK; return ( TCL_OK ) ; } Обязательно завершайте функцию TCL_OK или 0. Любое другое значение, особенно минусовое, вызовет ошибку или не правильную интерпретацию при выполнении созданной Вами МОМ команды. Особенно это касается значений TCL_BREAK, TCL_CONTINUE.
|
/*-----------------------------------------------------------------------*/ static int mom_UI_message_dialog ( void *client_data, /* This is the mom object */ void *interp, /* Pointer to the TCL interpreter */ int argc, /* Count of the numnber of arguments */ char **argv /* Array of arguments where the argv[0] - The TCL extension */ ) { Tcl_Interp *intrp = ( Tcl_Interp *) interp ; UF_MOM_id_t mom_id = ( UF_MOM_id_t ) client_data ; char str_return[10]; const int Size = 30 ; int i , l , cnt; UF_UI_MESSAGE_DIALOG_TYPE type_message ; char *mes1[Size] ; UF_UI_message_buttons_t buttons0 ; UF_UI_message_buttons_t buttons1 = { TRUE, TRUE, TRUE, "Abort", "Retry", "Ignore", 1, 2, 3 }; UF_UI_message_buttons_t buttons2 = { TRUE, FALSE, FALSE, "OK", NULL, NULL, 1, 0, 0 }; UF_UI_message_buttons_t buttons3 = { TRUE, FALSE, TRUE, "OK", NULL, "Cancel", 1, 0, 3 }; UF_UI_message_buttons_t buttons4 = { TRUE, FALSE, TRUE, "Retry", NULL, "Cancel", 1, 0, 3 }; UF_UI_message_buttons_t buttons5 = { TRUE, FALSE, TRUE, "Yes", NULL, "No", 1, 0, 3 }; UF_UI_message_buttons_t buttons6 = { TRUE, TRUE, TRUE, "Yes", "No", "Cancel", 1, 2, 3 }; int response ; type_message=UF_UI_MESSAGE_INFORMATION ; /*UF_UI_MESSAGE_ERROR UF_UI_MESSAGE_WARNING UF_UI_MESSAGE_INFORMATION UF_UI_MESSAGE_QUESTION*/ buttons0 = buttons2; /* читаем переданные аргументы*/ cnt=0; for (i=0;i<argc;i++) { if (i==1 || i==2) { if (0==strcmp(argv[i],"ERROR")) { type_message=UF_UI_MESSAGE_ERROR ; continue ; } if ((0==strcmp(argv[i],"WARNING"))||(0==strcmp(argv[i],"WARN"))) { type_message=UF_UI_MESSAGE_WARNING ; continue ; } if ((0==strcmp(argv[i],"INFORMATION"))||(0==strcmp(argv[i],"INFO"))) { type_message=UF_UI_MESSAGE_INFORMATION ; continue ; } if ((0==strcmp(argv[i],"QUESTION"))||(0==strcmp(argv[i],"?"))) { type_message=UF_UI_MESSAGE_QUESTION ; continue ; } if (0==strcmp(argv[i],"ABORTRETRYIGNORE")) { buttons0=buttons1 ; continue ; } if (0==strcmp(argv[i],"OK")) { buttons0=buttons2 ; continue ; } if (0==strcmp(argv[i],"OKCANCEL")) { buttons0=buttons3 ; continue ; } if (0==strcmp(argv[i],"RETRYCANCEL")) { buttons0=buttons4 ; continue ; } if (0==strcmp(argv[i],"YESNO")) { buttons0=buttons5 ; continue ; } if (0==strcmp(argv[i],"YESNOCANCEL")) { buttons0=buttons6 ; continue ; } } if (i>=1) { if (cnt>=Size) break ; l=(int)strlen(argv[i])+1; mes1[cnt]=new char [l]; mes1[cnt][0]='\0'; sprintf(mes1[cnt],"%s",argv[i]); cnt++; } } response=0; if (argc>=2 && cnt!=0) { UF_UI_message_dialog("PostProcessor.....", type_message , mes1, cnt, TRUE, &buttons0, &response); for (i=0;i<cnt;i++) delete mes1[i] ; //delete [] mes1 ; } // устанавливаем переменную в мом UF_MOM_set_int ( mom_id , "ui_message_return",response ) ; // устанавливаем возвращаемое значение в функцию str_return[0]='\0'; sprintf(str_return,"%d",response); intrp->result=str_return; intrp->errorLine=TCL_OK; return ( TCL_OK ) ; } |
Определяем МОМ
команды , в данном случае вывод сообщения - у нас он будет модален (то-есть постпроцесс прервется , до тех пор, пока технолог не среагирует на выводимое сообщение) Команда будет иметь вид: set ret [ MOM_ui_message ?typesign ?button ?m1 ?m2 ?m3 ?m4 ... ] где typesign = { ERROR|WARNING|INFORMATION|QUESTION } - тип значка (сообщения) { ERROR|WARN|INFO|? } - их сокращенная запись button = { ABORTRETRYIGNORE The message box contains three push buttons: Abort, Retry, and Ignore. OK The message box contains one push button: OK. This is the default. OKCANCEL The message box contains two push buttons: OK and Cancel. RETRYCANCEL The message box contains two push buttons: Retry and Cancel. YESNO The message box contains two push buttons: Yes and No. YESNOCANCEL The message box contains three push buttons: Yes, No, and Cancel. } - тип и число показа кнопок МОМ команда будет возвращать значение: ret = {1 2 3} if message box contains three push buttons ret = {1 3} if message box contains two push buttons Например: set mes1 "Привет" |
/*-----------------------------------------------------------------------*/ static int mom_ask_part_attr ( void *client_data, /* This is the mom object */ void *interp, /* Pointer to the TCL interpreter */ int argc, /* Count of the numnber of arguments */ char **argv /* Array of arguments where the argv[0] - The TCL extension */ ) { char set_part_name[MAX_FSPEC_SIZE+UF_UGMGR_FNAME_SIZE+UF_UGMGR_PARTREV_SIZE+1]=""; Tcl_Interp *intrp = ( Tcl_Interp *) interp ; UF_MOM_id_t mom_id = ( UF_MOM_id_t ) client_data ; tag_t work_part_tag; char work_part_name[MAX_FSPEC_SIZE+1]=""; UF_UGMGR_tag_t db_tag; logical is_active; char part_number[UF_UGMGR_PARTNO_SIZE+1]=""; char part_revision[UF_UGMGR_PARTREV_SIZE+1]=""; char part_file_type[UF_UGMGR_FTYPE_SIZE+1]=""; char part_file_name[UF_UGMGR_FNAME_SIZE+1]=""; char part_name[UF_UGMGR_NAME_SIZE+1]=""; char part_desc[UF_UGMGR_DESC_SIZE+1]=""; char *p_part_desc; char *ptr; intrp->result=""; intrp->errorLine=TCL_OK; UF_CALL( UF_is_ugmanager_active ( &is_active ) ); if (is_active==FALSE) work_part_tag=UF_PART_ask_display_part(); else work_part_tag = UF_ASSEM_ask_work_part(); if (work_part_tag==null_tag) return (TCL_OK); UF_CALL( UF_PART_ask_part_name( work_part_tag, work_part_name ) ); if (is_active==TRUE) { UF_print_syslog(" mom_ask_part_attr - Encoding UG/Manager part filename...\n",FALSE); UF_CALL( UF_UGMGR_decode_part_filename( work_part_name, part_number, part_revision, part_file_type, part_file_name ) ); } UF_MOM_set_string ( mom_id , "ask_part_number",part_number ) ; UF_MOM_set_string ( mom_id , "ask_part_revision",part_revision ) ; UF_MOM_set_string ( mom_id , "ask_part_file_type",part_file_type ) ; UF_MOM_set_string ( mom_id , "ask_part_file_name",part_file_name ) ; if (is_active==FALSE) { part_desc[0]='\0'; p_part_desc=part_desc; UF_CALL( UF_PART_ask_description(work_part_tag,&p_part_desc) ); } else { UF_CALL( UF_UGMGR_ask_part_tag( part_number, &db_tag ) ); UF_CALL( UF_UGMGR_ask_part_name_desc( db_tag, part_name, part_desc ) ); } UF_MOM_set_string ( mom_id , "ask_part_name",part_name ) ; UF_MOM_set_string ( mom_id , "ask_part_desc",part_desc ) ; set_part_name[0]='\0'; if (is_active==FALSE) { ptr = strrchr(work_part_name, '\\'); if (ptr) sprintf(set_part_name,"%s",ptr+1); else sprintf(set_part_name,"%s",work_part_name); } else { sprintf(set_part_name,"%s_%s",part_file_name,part_revision); } // if (p_part_desc!=NULL) UF_free(p_part_desc); intrp->result=set_part_name; intrp->errorLine=TCL_OK; return ( TCL_OK ) ; } |
Команда
будет иметь вид: set name_part [ MOM_ask_part_attr ] используя UGMGR устанавливаем mom переменные (переменные должны уже быть описаны global .... и существовать до вызова) Команда будет возвращать строку вида: {part_file_name}_{part_revision} Тогда после работы МОМ команды будем иметь: name_part=T_T7.92.0562.078.000.73_raz_cam2_A mom_ask_part_number =T_T7.92.0562.078.000.73_raz mom_ask_part_revision =A mom_ask_part_file_type =manifestation mom_ask_part_file_name =T_T7.92.0562.078.000.73_raz_cam2 mom_ask_part_name =ОКАНТОВКА_БАГАЖ_ЛЮКА mom_ask_part_desc =ж/н RRJ "разв.стр."п.148;п.154;РЦ-103гр.97-006-2005 |
int do_it( char *param ) { int errorCode ; UF_MOM_id_t mom ; void *interp = NULL ; /* Get the TCL interpreter id from the ufusr param */ errorCode=UF_CALL( UF_MOM_ask_interp_from_param ( param, &interp ) ); if ( 0 != errorCode ) { UF_print_syslog("Don't get the TCL interpreter id from the ufusr 'param'\nDLL terminated...\n",FALSE); return(-1) ; } /* Get the MOM id from the ufusr param */ errorCode=UF_CALL( UF_MOM_ask_mom (param, &mom) ) ; if ( 0 != errorCode ) { UF_print_syslog("Don't get the MOM id from the ufusr param\nDLL terminated...\n",FALSE); return(-1) ; } /*Загрузка в Интерпретатор*/ UF_print_syslog("- >pb_base_ex start \n",FALSE); errorCode = UF_MOM_extend_xlator ( mom , "MOM_ui_message", mom_UI_message_dialog ) ; if ( 0 != errorCode ) UF_print_syslog("Don't get UF_MOM_extend_xlator ... MOM_ui_message \n",FALSE); errorCode = UF_MOM_extend_xlator ( mom , "MOM_ask_part_attr", mom_ask_part_attr ) ; if ( 0 != errorCode ) UF_print_syslog("Don't get UF_MOM_extend_xlator ... MOM_ask_part_attr \n",FALSE); UF_print_syslog("- >pb_base_ex end \n",FALSE); return (0); } |
Загружаем
созданные Функции в интерпретатор. Здесь создаем : MOM_ui_message Не бойтесь использовать функцию UF_print_syslog , для вывода отладочных и диагностических сообщений в Лог-файл Юниграфики. Обратите внимание, что для нашего случая достаточно применять функцию UF_MOM_ask_mom, вызов функции UF_MOM_ask_interp_from_param - избыточен, и в принципе не нужен. Он необходим для других вещей. |
//---------------------------------------------------------------------------- // Activation Methods //---------------------------------------------------------------------------- // Explicit Activation // This entry point is used to activate the application explicitly, as in // "File->Execute UG/Open->User Function..." extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen ) { /* Initialize the API environment */ int errorCode = UF_initialize(); if ( 0 == errorCode ) { /* TODO: Add your application code here */ do_it( parm ); /* Terminate the API environment */ errorCode = UF_terminate(); } /* Print out any error messages */ PrintErrorMessage( errorCode ); *returnCode=0; } |
Инициализируем
лицензию. Если она есть, запускаем do_it( parm ) и передаем ей параметр для получения интерпретатора. по завершении регистрации функций в МОМ, возвращаем в процесс UniGraphiCS - 0 *returnCode=0; - это в принципе не обязательно, но мне так больше нравиться. |
//---------------------------------------------------------------------------- // Utilities //---------------------------------------------------------------------------- // Unload Handler // This function specifies when to unload your application from Unigraphics. // If your application registers a callback (from a MenuScript item or a // User Defined Object for example), this function MUST return // "UF_UNLOAD_UG_TERMINATE". extern "C" int ufusr_ask_unload( void ) { /* unload immediately after application exits*/ //return ( UF_UNLOAD_IMMEDIATELY ); /*via the unload selection dialog... */ return ( UF_UNLOAD_SEL_DIALOG ); /*when UG terminates... */ //return ( UF_UNLOAD_UG_TERMINATE ); } |
Обязательно
нужно указать UniGraphiCS как он должен
загружать/выгружать в память код Вашей программы. |
Сделаем небольшое отступление и обсудим компоновку dll.1) После создании приложения для Юниграфики, это приложение необходимо как то активировать или запускать в UG. Разработчики UG приняли соглашение, что для тех или иных случаев, или модулей, действует соглашение вызываемых имен. Как пример, могу привести: ufsta ufusr - имеющие для Юниграфики различные методы запуска. Возвращаясь к MOM-интерпретатору - нужно написать, что использовать для него такую точку входа: extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen ) { } для загрузки в Tcl посредством - MOM_run_user_function <shared_library_name> ufusr - вовсе не обязательно. Для этого, Вы, можете употреблять любое другое название удобное Вам. Например: extern "C" DllExport void user_my( char *parm, int *returnCode, int rlen )
{
}
После этого, Вы, лишь измените способ загрузки в постпроцессоре, указав : MOM_run_user_function <shared_library_name> user_my 2) Если Вы все же решили, что хотите применять для выгрузки приложения параметр "UF_UNLOAD_UG_TERMINATE": . extern "C" int ufusr_ask_unload( void ) { /*when UG terminates... */ return ( UF_UNLOAD_UG_TERMINATE ); }тогда советуем предусмотреть при его реализации возможность выгрузить библиотеку.
|
|
/* PrintErrorMessage ** ** Prints error messages to standard error and the Unigraphics status ** line. */ static void PrintErrorMessage( int errorCode ) { if ( 0 != errorCode ) { /* Retrieve the associated error message */ char message[133]; UF_get_fail_message( errorCode, message ); /* Print out the message */ UF_UI_set_status( message ); fprintf( stderr, "%s\n", message ); } } |
Стандартная
функция вывода ошибок в окно статуса. Только прочитать их не всегда можно успеть. ![]() |
Выгрузка MOM-библиотеки происходить из меню Юниграфики:
Файл -> Утилиты -> Выгрузка общей библиотеки
Пусть : Мы
получили , и собрали 2-е библиотеки:
pb_base_ex_x32.dll (для 32 битной
версии Unigraphics)
pb_base_ex_x64.dll
(для 64 битной версии Юга
Загружаем полученные функции через
MOM_run_user_function - загружать необходимо
только один раз, желательно в функции OPEN_FILES. Эту тему мы также рассмотрим
здесь.
Выгружать подобные расширения можно через MOM_unload_library
,
но часто в этом просто нет необходимости.
Пример подключения постпроцессора и MOM - расширения : source_post_mom.zip
![]() Это поняли сами разработчики, когда начали обновлять систему: так в скрипте обновления проверка этого производиться на основе существования директории (папки) %BASE%\ugii\p4libs данная папка существует только в 32-х битной версии UG, если данной папки нет, то вы используете 64-х битную версию UG ![]() rem Check PLATFORM ____________________ NX 4.0.1.2 rem This update can contain either 32 bit or 64 bit software. Must make sure rem the user is installing this update on the same type of software that is rem already installed in %UGII_BASE_DIR%. If not - we must exit. rem Note: Checking %PROCESSOR_ARCHITECTURE is unreliable so must ck for p4libs. rem Look for %BASE%\ugii\p4libs folder - it only exists on 32 bit. rem rem if p4libs exists base dir must have 32 bit software else its 64 bit. if exist "%BASE%"\ugii\p4libs ( set INSTALLED_PLATFORM=x86 ) else ( set INSTALLED_PLATFORM=AMD64 ) if not "%REQUIRED_PLATFORM%" == "%INSTALLED_PLATFORM%" goto wrong_platform_exit rem End Platform checks. # The following platform variables should not be changed. They are defined # here so that TBR, MEN, etc. files that users want to share between Windows 32 # and Windows 64 can have a way to specify the exact DLL to be run, as the # DLL's will be different on the two platforms. # #if x64wnt UGII_PLATFORM=x64wnt #endif #if ix86wnt UGII_PLATFORM=ix8xwnt #endif # значения которых можно узнать MOM командой [ MOM_ask_env_var UGII_PLATFORM ] |
Для загрузки Вашей библиотеки создайте пользовательскую MOM функцию (например):
|
|
|
#================================================ proc PB_CMD_init_dll { } { #================================================ global cam_post_dir if {![hiset cam_post_dir]} { set cam_post_dir [MOM_ask_env_var UGII_CAM_POST_DIR] ; } set x64 0 set root_dir [MOM_ask_env_var UGII_ROOT_DIR] ; set user_is64 ${root_dir}ugtcl.dll if { [file exists $user_is64] } { set sz [ file size $user_is64 ] set sz [ expr double($sz) ] # 616 960 байт for 64bit -- 462 848 байт for 32 if {$sz>600000.} { set x64 1 ; } else { set x64 0 ; } } set user_dll ${cam_post_dir}pb_base_ex_x32.dll if {$x64} { set user_dll ${cam_post_dir}pb_base_ex_x64.dll } set errMes "" if { [file exists $user_dll] } { catch { MOM_run_user_function $user_dll ufusr } errMes } MOM_log_message "MOM_run_user_function -> $errMes" return 0 } |
И подключите её в своем постпроцессоре : |
|
После того, как Ваша библиотека успешно загрузиться в MOM, Вы можете применять свои функции в любом месте постпроцессора:
if {[llength [info commands MOM_ui_message ] ]} { set mes1 "Привет" set mes2 "Вы готовы для изменений?" set ret [ MOM_ui_message INFO YESNO $mes1 $mes2 ] if {$ret==3} { ;# вы нажали NO } else { ;# вы нажали Да } } if {[llength [info commands MOM_ask_part_attr ] ]} { global mom_ask_part_number mom_ask_part_revision mom_ask_part_file_type global mom_ask_part_file_name mom_ask_part_name mom_ask_part_desc set name_part [ MOM_ask_part_attr ] MOM_output_text "$name_part" ; # =T_T7.92.0562.078.000.73_raz_cam2_A MOM_output_text "$mom_ask_part_number " ; # =T_T7.92.0562.078.000.73_raz MOM_output_text "$mom_ask_part_revision" ; # =A MOM_output_text "$mom_ask_part_file_type" ; # =manifestation MOM_output_text "$mom_ask_part_file_name" ; # =T_T7.92.0562.078.000.73_raz_cam2 MOM_output_text "$mom_ask_part_name" ; # =ОКАНТОВКА_БАГАЖ_ЛЮКА MOM_output_text "$mom_ask_part_desc" ; # =ж/н RRJ "разв.стр."п.148;п.154;РЦ-103гр.97-006-2005 }
Если Вы распространяете свой
постпроцессор в виде папки, то-есть:
Тогда модифицируйте процедуру загрузки ниже показанным способом:
#================================================ proc PB_CMD_init_dll { } { #================================================ global cam_post_dir if {![hiset cam_post_dir]} { set cam_post_dir [MOM_ask_env_var UGII_CAM_POST_DIR] ; } set x64 0 set root_dir [MOM_ask_env_var UGII_ROOT_DIR] ; set user_is64 ${root_dir}ugtcl.dll if { [file exists $user_is64] } { set sz [ file size $user_is64 ] set sz [ expr double($sz) ] # 616 960 байт for 64bit -- 462 848 байт for 32 if {$sz>600000.} { set x64 1 ; } else { set x64 0 ; } } global mom_event_handler_file_name set path ""
set str [ file tail $mom_event_handler_file_name ]
regsub -nocase -- "$str" $mom_event_handler_file_name "" path global tcl_platform if [string match "*windows*" $tcl_platform(platform)] { set path "${path}\\" } else { set path "${path}/" } set user_dll ${path}pb_base_ex_x32.dll if {$x64} { set user_dll ${path}pb_base_ex_x64.dll } set errMes "" if { [file exists $user_dll] } { catch { MOM_run_user_function $user_dll ufusr } errMes } MOM_log_message "MOM_run_user_function -> $errMes" return 0 }
! Обратите внимание, что 'имя постпроцессора' ( *.tcl - файла) совпадает с названием папки.
Copyright © 2001—2009 че