/*****************************************************************************
**
** Ug2Ansys.cpp
**
** 描述: 实现从UG模型(单个部件或装配体)自动导出Parasolid格式模型, 作为Ansys输入
**
** 作者: 李 响, 中国地质大学(北京) 2006.12.31
** QQ : 6295685
** MSN : lx_popsoft@hotmail.com
**
*****************************************************************************/
/* 包含头文件 */
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
# include <strstream>
# include <iostream>
using std:strstream;
using std::endl;
using std::ends;
using std::cerr;
#else
# include <strstream.h>
# include <iostream.h>
#endif
#include <stdio.h>
#include <uf.h>
#include <uf_part.h>
#include <uf_modl.h>
#include <uf_assem.h>
#include <uf_ps.h>
#include <uf_obj.h>
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
//================================================================
// 函数声明
static void PrintErrorMessage( int error_code, char *msg_text);
void make_body_list_part(tag_t part_tag);
void make_body_list_assem(tag_t body_tag);
//================================================================
// 全局变量, 定义链表
uf_list_p_t body_list;
//================================================================
static int report_error( char *file, int line, char *call, int irc)
{
if (irc)
{
char err[133],
msg[133];
sprintf(msg, "*** ERROR code %d at line %d in %s:\n+++ ",
irc, line, file);
UF_get_fail_message(irc, err);
UF_print_syslog(msg, FALSE);
UF_print_syslog(err, FALSE);
UF_print_syslog("\n", FALSE);
UF_print_syslog(call, FALSE);
UF_print_syslog(";\n", FALSE);
}
return(irc);
}
/* 主程序 */
extern void main( char argc, char *argv[] )
{
//======================================================
static char prtname[133]; // 部件文件名
static char expname[133]; // 表达式文件名
static char x_tname[133]; // Parasolid文件名
// 读取输入参数: 部件文件名, 表达式文件名, Parasolid文件名
// 注意Parasolid文件名默认路径C:\Documents and Settings\lix\Local Settings\Temp, 且每次运行前注意将其删除
strcpy(prtname, argv[1]);
strcpy(expname, argv[2]);
strcpy(x_tname, argv[3]);
//======================================================
/* 初始化API环境 */
if( UF_CALL(UF_initialize()) )
{
/* 初始化失败 */
return;
}
//======================================================
// 更新模型部分
//======================================================
tag_t part_tag; // 部件标识
UF_PART_load_status_t load_status; // 表示打开的文件操作是否产生错误
//======================================================
// 打开部件
int status = UF_PART_open(prtname, &part_tag, &load_status);
if (status != 0)
PrintErrorMessage(status, "Failed in UF_PART_open!");
// 导入表达式文件
status = UF_MODL_import_exp(expname, 0);
if (status != 0)
PrintErrorMessage(status, "Import of expression failed!");
// 更新处理
status = UF_MODL_update();
if (status != 0)
PrintErrorMessage(status, "Update failed!");
// 保存更新后部件
status = UF_PART_save();
if (status != 0)
PrintErrorMessage(status, "Saving failed!");
//======================================================
// 导出Parasolid格式文件部分
//======================================================
// 获得装配树根事例root_part_occ, 当函数返回NULL_TAG时, 表明当前部件文件中没有装配(即单个部件)
tag_t root_part_occ = UF_ASSEM_ask_root_part_occ(part_tag);
//======================================================
// 创建链表
status = UF_MODL_create_list(&body_list);
if (status != 0)
PrintErrorMessage(status, "Create list failed!");
// 如果是单个部件
if(root_part_occ == NULL_TAG)
{
// 将当前单个部件加入到链表中
make_body_list_part(part_tag);
}
//如果是装配体
else
{
tag_t obj = UF_ASSEM_ask_prototype_of_occ(root_part_occ);
make_body_list_assem(obj);
}
//======================================================
// 链表长度
//int list_count;
// 获取链表长度
//status = UF_MODL_ask_list_count(body_list, &list_count);
//if (status != 0)
// PrintErrorMessage(status, "Ask list count failed!");
//// 输出链表长度
//printf("====================================");
//printf("\n==list_count==%d\n", list_count);
//printf("====================================");
//======================================================
// 如果文件存在, 先删除
remove(x_tname);
// 创建Parasolid文件
status = UF_PS_export_data(body_list, x_tname);
if (status != 0)
PrintErrorMessage(status, "arasolid export failed!");
// 删除链表
status = UF_MODL_delete_list(&body_list);
if (status != 0)
PrintErrorMessage(status, "Delete body_list failed!");
//======================================================
/* 退出API环境 */
UF_CALL(UF_terminate());
} |