#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,"");
}
}