Показанный ниже пример основан на реальных примерах: сборнике библиотек mom_user_*.dll. Функция отвечающая за проверку имен компьютеров и логинов пользователей переписана с нуля "0", я лишь показал логический ход их мыслей..:)
Как Вы увидите ниже. Обычный функционал dll, действительно, состоит из 2-х частей.
проверяет параметры запуска используя
функцию Юниграфики UF_ask_system_info. Проверка по имени пользователя и имени
компьютера, интересна и маразматична. Выходит, что если пользователь
уволится через полгода или обновиться Юг, то придется заново обращаться,
для переделки библиотеки постпроцессора.:). Но
нужно признать, что этот способ не требует применения функционала WinApi
и
подходит для применения в Unix - системах.
набор функций MOM_output_literal с выводом кадра.
Си - код: |
||
... UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "0", &x); |
||
|
||
... UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "0", &x); |
||
|
Как Вы видите,
ничего серьезного в этом коде нет.
Особый случай, это использование команд:
INPUT_RETRACT
INPUT_ZERO
согласно логике создателей эти вызовы
создают диалоговые окна на основе команд
uc16xx. Но от них можно и нужно отказаться.
//////////////////////////////////////////////////////////////////////////////// // // mom_user.cpp // // Description: // Contains Unigraphics entry points for the application. // ////////////////////////////////////////////////////////////////////////////// // #define _CRT_SECURE_NO_DEPRECATE 1 // Include files #include <stdio.h> #include <string.h> #include <math.h> #include <uf.h> #include <uf_exit.h> #include <uf_ui.h> #include <uf_mom.h> #include "mom_user.h" // ----------------- #define MAXUSER 3 // структура параметров для сравнения struct { char user_name[128]; /* User, who is running this process */ char program_name[128]; /* The current program name */ char node_name[64]; /* Machine, on which this process is running */ } LibUser ; // процедура проверки с базой int checkLibUser() { int i , ret; UF_system_info_t zSystemInfo; LibUser Info[MAXUSER]; /* Заполняем массив структур */ Info[0].user_name = "user"; Info[0].program_name = ""; Info[0].node_name = ""; Info[1].user_name = "I"; Info[1].program_name = "NX 8.0.0.1"; Info[1].node_name = "I-pc"; Info[2].user_name = "You"; Info[2].program_name = "NX 4.1.1.1"; Info[2].node_name = "you-pc"; // и так далее .......... zSystemInfo.date_buf = NULL; /* Current date and time info */ UF_ask_system_info(&zSystemInfo); for (i=0;i<MAXUSER;i++) { if (0==strcmp(zSystemInfo.node_name, Info[i].node_name ) ) { ret=0; break; } } UF_free_system_info(&zSystemInfo); return ret; } /*----------------------------------------------------------------------- * Function Name: my_pro * вызов: my_pro * -----------------------------------------------------------------------*/ static int my_pro ( 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 */ ) { UF_MOM_id_t mom_id = ( UF_MOM_id_t ) client_data ; int ii ; char Dest[256] ; double angle1 , angle2 ; double x , y , z , i , j , k ; const char *kin_retract_distance ; double retract_distance ; double dx , dy , dz ; // проверка на ликвидность параметров if ( checkLibUser () !=0) { const int Size = 1024 ; char str[Size]="НА ЭТОМ РАБОЧЕМ МЕСТЕ ПОСТПРОЦЕССОР НЕ МОЖЕТ БЫТЬ ЗАПУЩЕН\n \0";
UF_UI_display_nonmodal_msg("Внимание!",
str, UF_UI_MSG_POS_CURSOR); if (0==strcmp(argv[1],"PLANE2")) if (0==strcmp(argv[1],"PLANE3")) if (0==strcmp(argv[1],"PLANE_moving_rot")) if (0==strcmp(argv[1],"PLANE_MILL")) if ( !strcmp(argv[1], "M128") ) if (0==strcmp(argv[1],"INPUT_RETRACT")) if (0==strcmp(argv[1],"INPUT_RETRACT_DIST")) dx=i*retract_distance + x ; UF_MOM_set_assoc_double_array(mom_id, "pos", "0", dx); UF_terminate(); return ( 0 ) ;} //---------------------------------------------------------------------------- // Activation Methods //---------------------------------------------------------------------------- // Explicit Activation if ( !UF_is_initialized() ) /* Get the TCL interpreter id from the ufusr param */ *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 ); } |
Copyright © 2001—2009 че