集成UG和ANSYS之一----UGUPDATE.EXE

集成UG和ANSYS之一----UGUPDATE.EXE

author:  san

email:   visualsan@yahoo.cn

前言

写给那些需要调用UG二次开发或者正在寻找ugupdate.exe的同学

                                               write by san,nuaa 202
                                                              2011,11,13

-----------------------------------------------------------------------------------------------

        根据表达式文件更新ug模型,通常是进行ug集成的方式之一。比如优化过程
      首先更新exp文件,然后调用UG update更新prt模型,再导入ANSYS
      计算。exp文件是一个表达式文件,可以用文本编辑器编辑,也可以
      在应用程序中动态修改。这是结构优化中调用ug的经典模式。

    不过这种调用UG update的模式效率很低,因为每次都要初始化ug api,
      所以更明智的做法是将UG update集成到系统中去,每次更新完部件
      后调用UG_MODL_SAVE保存,然后进行计算。而初始化只进行一次,这样的

  效率较高。
        当然进行prt文件参数化的方法很多,有直接调用UF_MODL_edit_exp
      更新表达式,然后UF_MODL_update更新模型,最后UG_MODL_SAVE保存
      模型;还有是重写exp文件,更新表达式。第一种对编程要求较高;
      第二种方式则有傻瓜式的编译生成UG_update.exe,然后批处理更新
      模型,isight软件好像提供一个叫UG_update.exe,每次重新初始化
      API,然后更新关闭,慢的一比;还有一种则是将优化算法和ug open api集成
      ,ug初始化一次。

    很多人找这个UG_update.exe,这里我就写一个
      简单的UG_update.exe。(如果想在ANSYS优化中使用UG,本人愚钝,无法

  导入PRT文件,好像需要转换层x_t格式,ug api有)。
 
使用方法:
        1.调用语句:简单的--》system("UG_update.exe  you.prt  you.exp");
                        复杂的--》createprocess(...)
        2.其中you.prt是你的prt文件每次;you.exp是你的exp文件名称。

UG_update.exe代码如下:

#include <iostream>
#include <string>
#include <uf.h>
#include <uf_modl.h>
#include <uf_part.h>
#include <uf_modl_expressions.h>
using namespace std;
//write by san ,nuaa 202,2011.11.13
// visualsan@yahoo.cn
//引入lib文件,因人而异
#pragma comment(lib,"F:\\Program Files\\UGS\\NX 4.0\\UGOPEN\\libufun.lib")

#define VISUALSAN_NUAA_202_RUN(x)\
if(0!=x)\
{\
char msg[133];\
UF_get_fail_message( x,msg );\
cout<<msg;\
return -1;\
}

int main(int argc,char **argv)
{

//首先初始化ug api,否则其它ug函数是无法使用
VISUALSAN_NUAA_202_RUN( UF_initialize() );

//文件路径
string prt,ep;

/*参数个数检查,
注意用system("ugupdate.exe xx.prt xx.exp")调用时,默认第一个参数为exe地址,所以你的参数
是第二个开始;用createprocess时,参数和你传递的一样
system("UG_update.exe xx.prt yy.exp")
argv[0]=UG_update.exe argv[1]=xx.prt argv[2]=yy.exp
createprocess("UG_update.exe","xx.prt yy.exp",....)
argv[0]=xx.prt argv[1]=yy.exp

  在参数位置上有所差别
*/


if( argc<2 )
{
cerr<<"参数个数不足";
return -1;
}
//默认你是用createprocess创建线程的
if(argc==2)
{
prt = argv[0]; //prt文件
ep = argv[1]; //exp文件
}
//否则是用system调用的
else
{
prt = argv[1]; //prt文件
ep = argv[2]; //exp文件
}

//打开模型文件
UF_PART_load_status_t st;
tag_t prt_id;
//打开prt文件
VISUALSAN_NUAA_202_RUN( UF_PART_open( prt.c_str(), &prt_id, &st ) );
//更新模型文件
VISUALSAN_NUAA_202_RUN( UF_MODL_import_exp( (char*)ep.c_str() , 0) );
//更新模型
VISUALSAN_NUAA_202_RUN( UF_MODL_update() );
//写入文件
   
VISUALSAN_NUAA_202_RUN( UF_PART_save() );
//关闭prt文件
    VISUALSAN_NUAA_202_RUN( UF_PART_close(prt_id,1,1) );
   VISUALSAN_NUAA_202_RUN( UF_PART_free_load_status(&st) );
//退出前UF_terminate调用清理
VISUALSAN_NUAA_202_RUN( UF_terminate() );

return 0;
}


代码编译生成ugupdate.exe

代码使用:

1、新建一个长方体模型,参数为w,h,length.,另存为box.prt文件。

 

2.导出exp文件,另存为box.exp文件,如图

打开box.exp,可以看见表达式:

修改box.exp为 h=200,length=300,w=400

保存备用。

 

 

调用方式1:system("ugupdate.exe  box.prt  box.exp")

#include <iostream>
//write by san,nuaa,202
using namespace std;
void main()
{
cout<<"ug1\n";
system("UG_UPDATE.exe box.prt box.exp");
}

调用方式2:createprocess

#include <windows.h>
#include <iostream>
using namespace std;
//write by san ,nuaa 202,2011.11.13
// visualsan@yahoo.cn
int main(int argc,char**argv)
{
//是否显示窗口
bool bShowWnd=1;

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
si.dwFlags=STARTF_USESHOWWINDOW;
si.wShowWindow=bShowWnd?SW_SHOW:SW_HIDE;
if( !CreateProcess("UG_UPDATE.exe",// module name (use command line)
"D:\\ug\\box.prt D:\\ug\\box.exp", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)

{
cerr<<"CreateProcess failed ";
return -1;
}
//wait until end
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

return 0;
}

调用完后你会发现模型的参数变了。

------------------------------------------------------------------------------------------------------------                                                       

                                                write by san,nuaa 202

                                                 Email:visualsan@yahoo.cn

                                                                 2011,11,13


                                         

posted on 2011-11-13 17:06  DoJustForFun  阅读(4712)  评论(2编辑  收藏  举报

导航