首页   产品介绍   开发培训   技术文档   下载中心   招聘信息   客户服务  
   
公司产品
自动拼图系统
工程图辅助设计系统OpenDraft
G/OpenAPI开发宝典-基础篇
UG/OpenAPI开发宝典-问答篇
UG/OpenAPI开发宝典-实例篇
UG/OpenAPI开发宝典-综合篇
电极工艺图生成系统
孔自动标注
注塑模具辅助设计系统OpenMold
加工表单生成器
电极自动生成工具
加工辅助工具集ToolCAM
文件加密系统
公差自动标注系统
车床快速设计系统
格栅除污机快速设计系统
     
FLEXlm对CADLicense的管理
UG中约束的分类与应用
Windows平台上UG的二次开发
UG中标准件库的建立
UG中装配件特殊运动的实现
UG的二次开发中特征的识别和设定
UG二次开发的自动装配技术
UG二次开发中定位约束孔的建立
UG二次开发中爆炸图和ODBC示例
UG二次开发动画示例
             
 
产品介绍
公司产品
培训与招聘
相关信息
技术文档
技术文档
技术交流
联系我们
相关联接
技术联接

UGOPEN

UG二次开发中爆炸图和ODBC示例

南京欧奔软件技术有限公司

#include "stdAfx.h"

#include <stdio.h>

#include <uf.h>

#include <uf_defs.h>

#include <uf_exit.h>

#include <uf_ui.h>

#include <uf_styler.h>

#include <uf_mb.h>

#include "bzt.h"

#include <uf_part.h>

#include <uf_assem.h>

#include <string.h>

#include <uf_view.h>

#include <uf_cfi.h>

#include <math.h>

 

/* The following definition defines the number of callback entries */

/* in the callback structure:                                      */

/* UF_STYLER_callback_info_t BZT_cbs */

#define BZT_CB_COUNT ( 5 + 1 ) /* Add 1 for the terminator */

 

/*--------------------------------------------------------------------------

The following structure defines the callback entries used by the      

styler file.  This structure MUST be passed into the user function,   

UF_STYLER_create_dialog along with BZT_CB_COUNT.                      

--------------------------------------------------------------------------*/

static UF_STYLER_callback_info_t BZT_cbs[BZT_CB_COUNT] =

{

 {UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB  , 0, BZT_construct_cb},

 {UF_STYLER_DIALOG_INDEX, UF_STYLER_DESTRUCTOR_CB   , 0, BZT_destruct_cb},

 {UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB           , 0, BZT_ok_cb},

 {UF_STYLER_DIALOG_INDEX, UF_STYLER_APPLY_CB        , 0, BZT_apply_cb},

 {UF_STYLER_DIALOG_INDEX, UF_STYLER_CANCEL_CB       , 0, BZT_cancel_cb},

 {UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }

};

 

 

static UF_MB_styler_actions_t actions[] = {

    { "bzt.dlg",  NULL,   BZT_cbs,  UF_MB_STYLER_IS_NOT_TOP },

    { NULL,  NULL,  NULL,  0 } /* This is a NULL terminated list */

};

 

extern int bzt( int *response )

{

    int  error_code = 0;

 

    if ( ( error_code = UF_initialize() ) != 0 )

           return (0) ;

 

    if ( ( error_code = UF_STYLER_create_dialog ( "bzt.dlg",

           BZT_cbs,      /* Callbacks from dialog */

           BZT_CB_COUNT, /* number of callbacks*/

           NULL,        /* This is your client data */

           response ) ) != 0 )

    {

          char fail_message[133];

 

          /* Get the user function fail message based on the fail code.*/

          UF_get_fail_message(error_code, fail_message);

          UF_UI_set_status (fail_message);

          printf ( "%s\n", fail_message );

    }

 

 

    UF_terminate();                            

    return (error_code);

}

 

int BZT_construct_cb ( int dialog_id,

             void * client_data,

             UF_STYLER_item_value_type_p_t callback_data)

{

     if ( UF_initialize() != 0)

          return ( UF_UI_CB_CONTINUE_DIALOG );

     UF_terminate ();

    return (UF_UI_CB_CONTINUE_DIALOG);

}

 

int BZT_destruct_cb ( int dialog_id,

             void * client_data,

             UF_STYLER_item_value_type_p_t callback_data)

{

     if ( UF_initialize() != 0)

          return ( UF_UI_CB_CONTINUE_DIALOG );

     UF_terminate ();

    return (UF_UI_CB_CONTINUE_DIALOG);

}

 

int BZT_ok_cb ( int dialog_id,

             void * client_data,

             UF_STYLER_item_value_type_p_t callback_data)

{

  

     tag_t part_tag,bzt_tag;

     if ( UF_initialize() != 0)

          return ( UF_UI_CB_CONTINUE_DIALOG );

 

        part_tag=UF_PART_ask_display_part();

     UG_OPEN_create_bzt(dialog_id,part_tag,&bzt_tag);

     UF_terminate ();

    return (UF_UI_CB_EXIT_DIALOG);                          

 

}

 

int BZT_apply_cb ( int dialog_id,

             void * client_data,

             UF_STYLER_item_value_type_p_t callback_data)

{

    

     tag_t part_tag,bzt_tag;

     if ( UF_initialize() != 0)

          return ( UF_UI_CB_CONTINUE_DIALOG );

 

        part_tag=UF_PART_ask_display_part();

     UG_OPEN_create_bzt(dialog_id,part_tag,&bzt_tag);

 

     UF_terminate ();

    return (UF_UI_CB_CONTINUE_DIALOG);

 

}

 

int BZT_cancel_cb ( int dialog_id,

             void * client_data,

             UF_STYLER_item_value_type_p_t callback_data)

{

     if ( UF_initialize() != 0)

          return ( UF_UI_CB_CONTINUE_DIALOG );

     UF_terminate ();

    return ( UF_UI_CB_EXIT_DIALOG );                      

 

}

 

 

void UG_OPEN_create_bzt(int dialog_id,tag_t part_tag,tag_t * bzt_tag)

{

  char bzt_name[50];

  UF_STYLER_item_value_type_t data;

  tag_t view_tag;

  int flag;

 

  data.item_id="STR_0";

  data.item_attr=UF_STYLER_VALUE;

  UF_STYLER_ask_value(dialog_id,&data);

  strcpy(bzt_name,data.value.string);

 

  if(strlen(bzt_name)!=0)

  {

   

         if(part_tag!=NULL_TAG)

         {

     

            UG_OPEN_is_multi_explosion(dialog_id ,&flag);

 

            UF_VIEW_ask_work_view (&view_tag );

        

            UG_OPEN_create_explosion(part_tag,bzt_name,

                                                    view_tag,bzt_tag); 

               if(*bzt_tag!=NULL_TAG)

               {

                     UG_OPEN_explosion_all_part_occ(*bzt_tag,view_tag,flag);

                     UF_DISP_regenerate_view (view_tag);

               }

         }

  }

  else

  {

    uc1601("请输入爆炸图名称",1);

  }

  UG_OPEN_set_record_status1("explosion","explosion");

}

 

 

void UG_OPEN_create_explosion(tag_t part_tag, char *explosion_name,

                                                   tag_t view_tag, tag_t *explosion_tag)

{

    int irc;

       if(part_tag!=NULL_TAG)

    {

       irc = UF_ASSEM_create_explosion (part_tag, explosion_name,explosion_tag);

       if(!irc)

       {

           if(view_tag!=NULL_TAG && *explosion_tag!=NULL_TAG)

                  UF_ASSEM_set_view_explosion (view_tag,*explosion_tag);

       }

          else

        {

           *explosion_tag = NULL_TAG;

        }

 

   }

}

 

void UG_OPEN_explosion_component(tag_t explosion_tag, tag_t part_occ,  double *origin,     tag_t view_tag )

{

    double transform[4][4];

      

    transform[0][0]=1;transform[0][1]=0;transform[0][2]=0;transform[0][3]=origin[0];

    transform[1][0]=0;transform[1][1]=1;transform[1][2]=0;transform[1][3]=origin[1];

    transform[2][0]=0;transform[2][1]=0;transform[2][2]=1;transform[2][3]=origin[2];

    transform[3][0]=0;transform[3][1]=0;transform[3][2]=0;transform[3][3]=1;

 

    UF_ASSEM_explode_component(explosion_tag,part_occ,transform);

}

 

 

void UG_OPEN_ask_explosion_data(char   *dsn_name,  char   *table_name,

                                                        char   *part_name, char   *inst_name,

                                                        char   *parent_name, double *origin ,int *flag)

{

    CDatabase sqldb;

       CString cstemp;

       DWORD dwOptions=0;

       CDBVariant temp;

       int result;

       char buf[255],temp1[50];

       char status[10];

    char  record_id[50];

  

       *flag=0;

       strcpy(buf,"DSN=");

       strcat(buf,dsn_name);

       result=sqldb.OpenEx(buf,dwOptions);

    if(result!=0)

       {

              CRecordset rs(&sqldb);

              cstemp.Format("SELECT * FROM %s WHERE part_name='%s' AND inst_name='%s' AND parent_name='%s'",

                                           table_name,part_name,inst_name,parent_name);

       

              if(rs.Open(CRecordset::snapshot,cstemp)!=false)

              {

            while(!rs.IsEOF())

                     {

                        rs.GetFieldValue("status",temp,DEFAULT_FIELD_TYPE);

                   if(temp.m_dwType!=DBVT_NULL)

                        {

                           strcpy(status ,(LPTSTR)(LPCSTR)(*(temp.m_pstring)));                        

                          

                        }

                            else

                  strcpy(status,"");

               

                            if(strcmp(status,"0")==0) break;

                            rs.MoveNext();

                     }

 

            if(!rs.IsEOF())

                     {

                      rs.GetFieldValue("x",temp,DEFAULT_FIELD_TYPE);

                    if(temp.m_dwType!=DBVT_NULL)

                            {

                            strcpy(temp1 ,(LPTSTR)(LPCSTR)(*(temp.m_pstring)));                        

                            origin[0]=atof(temp1);

                            }

                         else

                   origin[0]=0.0;

                           

                          rs.GetFieldValue("y",temp,DEFAULT_FIELD_TYPE);

                           if(temp.m_dwType!=DBVT_NULL)

                             {

                             strcpy(temp1 ,(LPTSTR)(LPCSTR)(*(temp.m_pstring)));                        

                             origin[1]=atof(temp1);

                             }

                             else

                    origin[1]=0.0;

              

                          rs.GetFieldValue("z",temp,DEFAULT_FIELD_TYPE);

                     if(temp.m_dwType!=DBVT_NULL)

                             {

                             strcpy(temp1 ,(LPTSTR)(LPCSTR)(*(temp.m_pstring)));                        

                             origin[2]=atof(temp1);

                             }

                       else

                    origin[2]=0.0;

                    

                             *flag=1;

 

                 rs.GetFieldValue("record_id",temp,DEFAULT_FIELD_TYPE);

                     if(temp.m_dwType!=DBVT_NULL)

                             {

                             strcpy(record_id ,(LPTSTR)(LPCSTR)(*(temp.m_pstring)));                         

                            

                             }

                       else

                 strcpy(record_id,"");       

                             UG_OPEN_set_record_status(dsn_name,table_name,record_id);

                     }  

              }

                 rs.Close();

      }

       sqldb.Close();   

}

 

/* 遍历当前显示文件树下的所有文件*/

 

void UG_OPEN_explosion_all_part_occ(tag_t bzt_tag, tag_t view_tag,int flag1)

{

   tag_t root_part_occ ,display_part;

   tag_t *child_part_occs;

   int part_num,i;

   char dsn_name[]="explosion",table_name[]="explosion";

   char part_name[255],inst_name[50],temp_name[256];

   double origin[3]; 

 

   char refset_name[ 30 + 1 ];

   double origin1[ 3 ];

   double csys_matrix[ 9 ];

   double transform[ 4 ][ 4 ];

   int flag=0;

   double new_origin[3];

   char parent_name[50];

  

   display_part = UF_PART_ask_display_part();

  

   if(display_part != NULL_TAG && bzt_tag!=NULL_TAG && view_tag!=NULL_TAG)

   {

       root_part_occ = UF_ASSEM_ask_root_part_occ(display_part);

       part_num = UF_ASSEM_ask_part_occ_children(root_part_occ,&child_part_occs);

       for(i=0;i<part_num;i++)

          {

          UF_ASSEM_ask_component_data (child_part_occs[i], temp_name,

                                        refset_name     ,   inst_name,

                                        origin1,   csys_matrix,transform);

               

               

         uc4574 (temp_name, 2, part_name);

              

               UG_OPEN_ask_parent_name(child_part_occs[i],parent_name);

               UG_OPEN_ask_explosion_data(dsn_name,table_name,part_name,inst_name,parent_name,origin,&flag);

         if(flag==1)

               {

                  UG_OPEN_new_origin(transform,origin,new_origin);

                      UG_OPEN_explosion_component(bzt_tag, child_part_occs[i],new_origin,view_tag);

         } 

               if(flag1)

               {

                  UG_OPEN_cycle_part_occ(child_part_occs[i],bzt_tag,view_tag);      

               }

          }

       UF_free(child_part_occs) ; 

   }

}

 

 

void UG_OPEN_cycle_part_occ(tag_t part_occ_tag,tag_t bzt_tag, tag_t view_tag)

{

   int part_num,i;

   tag_t *child_part_occs;

   int flag=0;

 

   char dsn_name[]="explosion",table_name[]="explosion";

   char part_name[255],inst_name[50],temp_name[256];

   double origin[3]; 

 

   char refset_name[ 30 + 1 ];

   double origin1[ 3 ];

   double csys_matrix[ 9 ] ;

   double transform[ 4 ][ 4 ];

   double new_origin[3];

   char parent_name[50];

 

   part_num=UF_ASSEM_ask_part_occ_children(part_occ_tag,&child_part_occs);

   for(i=0;i<part_num;i++)

   {

 

        UF_ASSEM_ask_component_data (child_part_occs[i], temp_name,

                                     refset_name  ,   inst_name,

                                     origin1,   csys_matrix,transform);

               

              uc4574 (temp_name, 2, part_name);

 

              UG_OPEN_ask_parent_name(child_part_occs[i],parent_name);

             UG_OPEN_ask_explosion_data(dsn_name,table_name,part_name,inst_name,parent_name,origin,&flag);

        if(flag==1)

              {

                     UG_OPEN_new_origin(transform,origin,new_origin);

                 UG_OPEN_explosion_component(bzt_tag, child_part_occs[i],new_origin,view_tag);

        } 

            

           UG_OPEN_cycle_part_occ(child_part_occs[i],bzt_tag,view_tag);      

   }

   UF_free(child_part_occs) ;

}

 

 

void UG_OPEN_new_origin(double trans[4][4],double *origin,double *new_origin)

{

  double i0,i1,i2,j0,j1,j2,k0,k1,k2;

  double x,y,z;

  double p,q,r;

 

 

  i0=trans[0][0];  i1=trans[0][1];  i2=trans[0][2];

  j0=trans[1][0];  j1=trans[1][1];  j2=trans[1][2];

  k0=trans[2][0];  k1=trans[2][1];  k2=trans[2][2];

 

  x=origin[0];

  y=origin[1];

  z=origin[2];

 

  if(!((i1*k0-i0*k1)*(i2*j0-i0*j2)-(i1*j0-i0*j1)*(i2*k0-i0*k2)))

  r=((j0*x-i0*y)*(i1*k0-k1*i0)-(k0*x-i0*z)*(i1*j0-i0*j1))/((i1*k0-i0*k1)*(i2*j0-i0*j2)-(i1*j0-i0*j1)*(i2*k0-i0*k2));

  else

  r=0;

 

  if(!((i1*j0-i0*j1)*(i2*k0-i0*k2)-(i1*k0-i0*k1)*(i2*j0-i0*j2)))

  q=((j0*x-i0*y)*(i2*k0-k2*i0)-(k0*x-i0*z)*(i2*j0-i0*j2))/((i1*j0-i0*j1)*(i2*k0-i0*k2)-(i1*k0-i0*k1)*(i2*j0-i0*j2));

  else

  q=0;

 

  if(i0!=0)    p=(x-q*i1-r*i2)/i0;

  else

  {

    if(j0!=0)  p=(y-q*j1-r*j2)/j0;

       else

       {

      if(k0!=0) p=(z-q*k1-r*k2)/k0; 

         else  p=0;

       }

  }

 

   new_origin[0]=origin[0];

   new_origin[1]=origin[1];

   new_origin[2]=origin[2];

}

 

void UG_OPEN_is_multi_explosion(int dialog_id ,int *flag)

{

   UF_STYLER_item_value_type_t  data;

   data.item_id="TOGGLE_0";

   data.item_attr=UF_STYLER_VALUE;

   UF_STYLER_ask_value(dialog_id,&data);

   *flag=data.value.integer;

}

 

 

void UG_OPEN_set_record_status(char *dsn_name, char *table_name, char *record_id)

{

 

    CDatabase sqldb;

       CString cstemp,sqlcom;

       DWORD dwOptions=0;

       CDBVariant temp;

       int result;

       char buf[255];

       strcpy(buf,"DSN=");

       strcat(buf,dsn_name);

    result=sqldb.OpenEx(buf,dwOptions);

    if(result!=0)

       {

         CRecordset rs(&sqldb);

      cstemp.Format("SELECT * FROM  %s WHERE record_id='%s'" ,table_name, record_id );

      if(rs.Open(CRecordset::snapshot,cstemp)!=false)

         {

                if(!rs.IsBOF() && !rs.IsEOF())

              {

                    sqlcom.Format("UPDATE  %s  SET  status='%s' WHERE record_id='%s'",table_name,"1", record_id);

                  sqldb.ExecuteSQL(sqlcom);

              }

           rs.Close();

         }

      sqldb.Close();

       }    

}

 

void UG_OPEN_set_record_status1(char *dsn_name, char *table_name)

{

 

    CDatabase sqldb;

       CString cstemp,sqlcom;

       DWORD dwOptions=0;

       CDBVariant temp;

       int result;

       char buf[255];

       strcpy(buf,"DSN=");

       strcat(buf,dsn_name);

    result=sqldb.OpenEx(buf,dwOptions);

    if(result!=0)

       {

         CRecordset rs(&sqldb);

         cstemp.Format("SELECT * FROM  %s " ,table_name);

         if(rs.Open(CRecordset::snapshot,cstemp)!=false)

         {

               if(!rs.IsBOF() && !rs.IsEOF())

              {

                 sqlcom.Format("UPDATE  %s  SET  status='%s'",table_name,"0");

                  sqldb.ExecuteSQL(sqlcom);

              }

              rs.Close();

         }

       }

        sqldb.Close();

}

 

 

 

 

void UG_OPEN_ask_parent_name(tag_t part_occ,char *parent_name)

{

    tag_t parent,instance;

    char temp_name[256+1];

       int irc;

       

       instance=UF_ASSEM_ask_inst_of_part_occ (part_occ);

       if(instance!=NULL_TAG) parent=UF_ASSEM_ask_parent_of_instance (instance );

       else parent=NULL_TAG;

    if(parent!=NULL_TAG)

       {

              irc=UF_PART_ask_part_name(parent,temp_name);

              if(!irc)

        {

                 uc4574 (temp_name, 2, parent_name);

              }

              else

              {

                strcpy(parent_name,"");

              }

       }

       else

       {

          strcpy(parent_name,"");

       }

}

 

 

Copyright © 2011 南京欧奔软件技术有限公司,保留全部权利
南京欧奔软件技术有限公司
地址: 南京市洪武路359号福鑫国际大厦22楼2205室 邮编: 210002
电话:(86)025-84456296 传真:(86)025-84456296 手机:13186429310
技术讨论QQ群:49466232
网站备案/许可证号:苏ICP备05038408号