Пример MOM - расширения + Защита. Часть 2.


Показанный ниже пример основан на реальных примерах: сборнике библиотек mom_user_*.dll.  Функция отвечающая за проверку имен компьютеров и логинов пользователей переписана с нуля "0", я лишь показал логический ход их мыслей..:)

Как Вы увидите ниже. Обычный функционал dll, действительно, состоит из 2-х частей.

  1. проверяет параметры запуска используя функцию Юниграфики UF_ask_system_info. Проверка по имени пользователя и имени компьютера, интересна и маразматична. Выходит, что если пользователь уволится через полгода или обновиться Юг, то придется заново обращаться, для переделки библиотеки постпроцессора.:). Но нужно признать, что этот способ не требует применения функционала WinApi и  подходит для применения в Unix - системах.

  2. набор функций 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", "1", &y);
    UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "2", &z);
    UF_MOM_set_assoc_double_array(mom_id, "pos", "0", x);
    UF_MOM_set_assoc_double_array(mom_id, "pos", "1", y);
    UF_MOM_set_assoc_double_array(mom_id, "pos", "2", z); ...

    Tcl - код:

    set mom_pos(0) $mom_mcs_goto(0)
    set mom_pos(1) $mom_mcs_goto(1)
    set mom_pos(2) $mom_mcs_goto(2)
    
    или
    
    for {set i 0} {$i<3} {incr i} {
      set mom_pos($i) $mom_mcs_goto($i)
    }
    ...
    UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "0", &x);
    UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "1", &y);
    UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "2", &z);
    sprintf(Dest, "MOM_output_literal \"L X%.3lf Y%.3lf F MAX\"", x, y);
    UF_MOM_execute_command(mom_id, Dest);
    sprintf(Dest, "MOM_output_literal \"L Z%.3lf F MAX\"", z);
    UF_MOM_execute_command(mom_id, Dest); ...
    Tcl - код:
    set x [ format "%.3lf" $mom_mcs_goto(0) ]
    set y [ format "%.3lf" $mom_mcs_goto(1) ]
    set z [ format "%.3lf" $mom_mcs_goto(2) ]
    MOM_output_literal "L X${x} Y${y} F MAX"
    MOM_output_literal "L Z${z} F MAX" 

    Как Вы видите, ничего серьезного в этом коде нет.
    Особый случай, это использование команд:
        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 */
  zSystemInfo.user_name = NULL; /* User, who is running this process */
  zSystemInfo.program_name = NULL; /* The current program name */
  zSystemInfo.node_name = NULL; /* Machine, on which this process is running */
  zSystemInfo.machine_type = NULL; /* Hardware type on which the machine is running */

  ret = 1 ;
  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);
      
UF_terminate();
       return ( 0 ) ;
   }

 if (0==strcmp(argv[1],"PLANE2"))
 {
     UF_MOM_ask_assoc_double_array(mom_id, "out_angle_pos", "0", &angle1);
     UF_MOM_ask_assoc_double_array(mom_id, "out_angle_pos", "1", &angle2);
     sprintf(Dest, "MOM_output_literal \"ROT Z%.3lf \"", angle2);
     UF_MOM_execute_command(mom_id, Dest);
     sprintf(Dest, "MOM_output_literal \"AROT Y%.3lf \"", angle1);
     UF_MOM_execute_command(mom_id, Dest);
  }

  if (0==strcmp(argv[1],"PLANE3"))
 {
    UF_MOM_ask_assoc_double_array(mom_id, "out_angle_pos", "0", &angle1);
    UF_MOM_ask_assoc_double_array(mom_id, "out_angle_pos", "1", &angle2);
    sprintf(Dest, "MOM_output_literal \"CYCL DEF 19.0 WORKING PLANE\"");
    UF_MOM_execute_command(mom_id, Dest);
    sprintf(Dest, "MOM_output_literal \"CYCL DEF 19.1 B%.3lf C%.3lf F1000 \"", angle1, angle2);
    UF_MOM_execute_command(mom_id, Dest);
    sprintf(Dest, "MOM_output_literal \"L C+Q122 B+Q121 R0 F MAX\"");
    UF_MOM_execute_command(mom_id, Dest);
 }

  if (0==strcmp(argv[1],"PLANE_moving_rot"))
 {
    UF_MOM_ask_assoc_double_array(mom_id, "pos", "0", &x);
    UF_MOM_ask_assoc_double_array(mom_id, "pos", "1", &y);
    UF_MOM_ask_assoc_double_array(mom_id, "pos", "2", &z);
    sprintf(Dest, "MOM_output_literal \"L X%.3lf Y%.3lf F MAX\"", x, y);
    UF_MOM_execute_command(mom_id, Dest);
    sprintf(Dest, "MOM_output_literal \"L Z%.3lf F MAX\"", z);
    UF_MOM_execute_command(mom_id, Dest);
 }

  if (0==strcmp(argv[1],"PLANE_MILL"))
 {
    UF_MOM_ask_assoc_double_array(mom_id, "out_angle_pos", "0", &angle1);
    UF_MOM_ask_assoc_double_array(mom_id, "out_angle_pos", "1", &angle2);
    UF_MOM_ask_assoc_double_array(mom_id, "prev_out_angle_pos", "0", &prev_angle1);
    UF_MOM_ask_assoc_double_array(mom_id, "prev_out_angle_pos", "1", &prev_angle2);
    UF_MOM_ask_assoc_double_array(mom_id, "pos", "0", &x);
    UF_MOM_ask_assoc_double_array(mom_id, "pos", "1", &y);
    UF_MOM_ask_assoc_double_array(mom_id, "pos", "2", &z);
    UF_MOM_ask_string(mom_id, "tool_cutcom_register", &tool_cutcom_register);
    tool = (int) atof(tool_cutcom_register);
    tool = tool + 2000 ;
    v1 = cos(angle1 * 0.0174532925199433);
    v2 = sin(angle1 * 0.0174532925199433);
    // #601=[[#%d]*2*[%.7lf]]
   sprintf( Dest, "MOM_output_literal \"\\043601=\\133\\133\\043%d\\135*2*\\133%.7lf\\135\\135\"", tool, v2);
   UF_MOM_execute_command(mom_id, Dest);
   // #602=[[#%d]*[%.7lf]-[#%d]]
   sprintf(Dest,"MOM_output_literal \"\\043602=\\133\\133\\043%d\\135*\\133%.7lf\\135\\-\\133\\043%d\\135\\135\"", tool, v1, tool);
   // G52 X[#601] Z[#602+#751]
   sprintf(Dest, "MOM_output_literal \"G52 X\\133\\043601\\135 Z\\133\\043602+\\043751\\135\"");
   UF_MOM_execute_command(mom_id, Dest);
   sprintf(Dest, "MOM_output_literal \"G54\"");
   UF_MOM_execute_command(mom_id, Dest);
 }

  if ( !strcmp(argv[1], "M128") )
 {
     UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "0", &x);
     UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "1", &y);
     UF_MOM_ask_assoc_double_array(mom_id, "mcs_goto", "2", &z);
     UF_MOM_set_assoc_double_array(mom_id, "pos", "0", x);
     UF_MOM_set_assoc_double_array(mom_id, "pos", "1", y);
     UF_MOM_set_assoc_double_array(mom_id, "pos", "2", z);
  }

  if (0==strcmp(argv[1],"INPUT_RETRACT"))
 {
     int ia4[2]={0,0},  ip6[2] = {1,1},  resp;
    double ra5[2] = { 100, 100 } ;
    char menu[2][16]; //={":Отвод=",":Врезание="};
    strcpy(&menu[0][0], ":Отвод (мм)=");
    strcpy(&menu[1][0], ":Врезание (мм)=");
     UF_UI_close_listing_window();
     UF_UI_lock_ug_access(UF_UI_FROM_CUSTOM);
     resp = uc1608(":Введите значения отвода и врезания инструмента:", menu, 2, ia4, ra5, ip6);
     UF_MOM_set_double(mom_id, "kin_retract_distance", ra5[0]);
     UF_MOM_set_double(mom_id, "kin_reengage_distance", ra5[1]);
     UF_UI_unlock_ug_access(UF_UI_FROM_CUSTOM);
  }

   if (0==strcmp(argv[1],"INPUT_RETRACT_DIST"))
  {
    uc1601(":Ввод дистанций отвода и врезания:", 0);
    UF_MOM_ask_assoc_double_array(mom_id, "prev_mcs_goto", "0", &x);
    UF_MOM_ask_assoc_double_array(mom_id, "prev_mcs_goto", "1", &y);
    UF_MOM_ask_assoc_double_array(mom_id, "prev_mcs_goto", "2", &z);
    UF_MOM_ask_assoc_double_array(mom_id, "prev_tool_axis", "0", &i);
    UF_MOM_ask_assoc_double_array(mom_id, "prev_tool_axis", "1", &j);
    UF_MOM_ask_assoc_double_array(mom_id, "prev_tool_axis", "2", &k);
    UF_MOM_ask_string(mom_id, "kin_retract_distance", &kin_retract_distance);
    retract_distance=atof(kin_retract_distance);
    //UF_free(&kin_retract_distance);

   dx=i*retract_distance + x ;
   dy=j*retract_distance + y ;
   dz=k*retract_distance + z ;

   UF_MOM_set_assoc_double_array(mom_id, "pos", "0", dx);
   UF_MOM_set_assoc_double_array(mom_id, "pos", "1", dy);
   UF_MOM_set_assoc_double_array(mom_id, "pos", "2", dz);
 }

  UF_terminate();

  return ( 0 ) ;
}

//----------------------------------------------------------------------------
// Activation Methods
//----------------------------------------------------------------------------

// Explicit Activation
// This entry point is used to activate the application explicitly, as in
// "File->Execute UG/Open->User Function..."
// MOM_run_user_function <shared_library_name> entry_mom
//----- (entry_mom) --------------------------------------------------------
extern "C" DllExport void entry_mom( char *parm, int *returnCode, int rlen )
{
    int errorCode ;
    UF_MOM_id_t mom ;
    void *interp = NULL ;

    if ( !UF_is_initialized() )
   {
       errorCode = UF_initialize();
      *returnCode = errorCode;
       if ( errorCode ) return ;
   }

   /* Get the TCL interpreter id from the ufusr param */
   UF_MOM_ask_interp_from_param ( parm, &interp ) ;
   /* Get the MOM id from the ufusr param */
   UF_MOM_ask_mom (parm, &mom) ;
   /*Создаем функции в интепретаторе*/
    UF_MOM_extend_xlator ( mom , "EXTN_mom", my_pro ) ;

   *returnCode = 0;
   if ( errorCode == 1 ) errorCode = UF_terminate();
   *returnCode = errorCode;
}

//----------------------------------------------------------------------------
// 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 че