|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
本帖最后由 Rainyboy 于 2010-10-14 22:35 编辑
不知大家有没有这样的经验,有些时候接了某研究所的课题,要求分析某个结构的强度或者寿命,或者再进一步形成这种结构的设计方法。合同中要求我们提供一个【界面程序】,在这个【界面程序】中,设计者只需要输入最原始的【几何参数】、【材料参数】、【载荷参数】,由该【界面程序】直接调用ANSYS进行计算和后处理。
整个过程中不需要直接接触APDL代码,完全是由“点鼠标”和“输入数据”完成。这样的【界面程序】有一个好处,就是使用者不必担心直接修改APDL源程序带来的版本混乱、功能出错等风险,而且比较方便。
0)先看一个【界面程序】的例子吧(为某单位开发的某结构计算软件,合同中有保密条款,所以作了些处理):
其他功能不提,当用户按下【开始计算】便会弹出如下对话框:
用户再次按下【确定】后,就会在程序当前运行的目录下生成一个与输入JobName相同的文件夹,并在此文件夹中载入ANSYS,运行后,其工具栏上会出现一些定制的功能按钮,点击这些按钮,就可以执行这些定制功能了(比如“建模”“分网”“求解”和“后处理”),而且还可以根据需要显示对话框:
这种【界面程序】的核心,在于外部程序中实现对ANSYS的调用和定制,这正是我想在这里和大家分享和探讨的问题。
1)定制ANSYS工具栏的流程(也许不是唯一的实现方法):
a) 准备好APDL(这一步通常希望由用户通过【界面程序】设置参数后完成,其实就是在指定的目录按照用户输入的参数生成文件,不是本帖的重点),将后缀名改为.MAC,存放在某个工作目录下。例如有建模代码MODEL.MAC和求解代码SOLU.MAC存放在目录d:/ansyswork下
b) 找到.../ANSYS INC/V110/ANSYS/APDL 中的start110.ans文件,在文件的最后加入:
/PSEARCH,
*ABBR,MODEL,MODEL
*ABBR,SOLU,SOLU
c)启动ANSYS11,设置工作目录为d:/ansyswork,那么ANSYS11启动完毕之后,就会在工具栏上出现MODEL和SOLU的按钮了,点击相应的按钮就相当于执行了对应文件中的APDL代码。
d)将start110.ans所增加的内容删除,避免对其它工作产生影响。
2)编程过程中的几个关键:
a)获得ANSYS的安装目录
- char *pAnsysDir;//ANSYS文件目录
- if(!(pAnsysDir=getenv("ANSYS100_DIR")))//由环境变量得到ANSYS文件目录
- return 0;
复制代码 b)以命令行方式调用ANSYS并指定JobName
- void CallANSYS(char *pAnsysDir,const char *pANSYSName)//调用ANSYS
- {
- char pLoadDir[DIRNAMEBUFFER];
- char t[]=""";
- char temp[DIRNAMEBUFFER];
- StrLink(t,temp,pAnsysDir);
- StrLink(temp,pLoadDir,"\\bin\\intel\\ansys100" -g -j ");
- StrLink(pLoadDir,pLoadDir,pANSYSName);
- system(pLoadDir);
- return;
- }
复制代码 3)程序源代码(CallAnsysSpeci.h头文件):
- #ifndef ASSUME_CALL_ANSYS_SPECI_RAINYBOY_20090310
- #define ASSUME_CALL_ANSYS_SPECI_RAINYBOY_20090310
- /************************************************************************/
- /* 在指定的目录载入指定的文件调用ANSYS */
- /* 范雨 2009年3月23日调试完毕 */
- /************************************************************************/
- //在之前应该在程序的工作目录中准备:
- //名字为APDLMAC文件夹
- //名字为APDLMAC文件夹,下有宏文件以及PSEARCH.txt文件
- //PSEARCH.txt文件的格式为:
- /*********************************************/
- /* /PSEARCH,
- /* *ABBR,******,******
- /* *ABBR,******,******
- /**********************************************/
- //宏文件的内容为APDL代码
- //后缀为.MAC
- //安装ANSYS10
- #include <windows.h>
- #include <stdlib.h>
- #include <iostream>
- #include <fstream>
- #include <string>
- using namespace std;
- #define DIRNAMEBUFFER 100
- void StrLink(char * pBase,char * pTarget,char *pAdd);//增长字符串
- void StrLink(char * pBase,char * pTarget,const char *pAdd);
- void SetAPDL(const char * pWorkDir,char * pApdlDir);//设置APDL宏:通过改写start文件
- void CallANSYS(char *pAnsysDir,const char *pANSYSName);//调用ANSYS
- void ClearAPDL(const char * pWorkDir,char * pApdlDir);//恢复APDL宏:通过恢复start文件
- int LoadAnsysFrom(const char *pWorkDir,const char *pANSYSName);
- void LoadANSYSNamed(const char *ANSYSName);//入口函数
- #endif
复制代码 4)程序代码(CallAnsysSpeci.cpp文件)
- #include "CallAnsysSpeci.h"
- //流程的具体实现
- void StrLink(char * pBase,char * pTarget,char *pAdd)//增长字符串
- {
- int i,len;
- for(i=0;1;++i)
- {
- if(pBase[i]=='\0')
- break;
- pTarget[i]=pBase[i];
- }
- len=i;
- //在末尾加上pAdd
- for(i=0;pAdd[i]!='\0';++i)
- pTarget[i+len]=pAdd[i];
- //封口
- pTarget[len+i]='\0';
- return;
- }
- void StrLink(char * pBase,char * pTarget,const char *pAdd)//增长字符串
- {
- int i,len;
- for(i=0;1;++i)
- {
- if(pBase[i]=='\0')
- break;
- pTarget[i]=pBase[i];
- }
- len=i;
- //在末尾加上pAdd
- for(i=0;pAdd[i]!='\0';++i)
- pTarget[i+len]=pAdd[i];
- //封口
- pTarget[len+i]='\0';
- return;
- }
- void SetAPDL(const char * pWorkDir,char * pApdlDir)//设置APDL宏:通过改写start文件
- {
- SetCurrentDirectory(pApdlDir);//将工作目录改为ADPL宏目录
- ifstream oldfile;
- ifstream datafile;
- ofstream newfile;
- char pBuff[DIRNAMEBUFFER];
- oldfile.open("start100.ans",ios::in);
- newfile.open("BB.ans",ios::out);
- //复制内容即可
- while (!oldfile.eof())
- {
- oldfile.getline(pBuff,DIRNAMEBUFFER);
- newfile<<pBuff<<endl;
- }
- oldfile.close();
- SetCurrentDirectory(pWorkDir);//恢复工作目录
- datafile.open("PSEARCH.txt",ios::in);
- //在第一行加上工作目录
- datafile.getline(pBuff,DIRNAMEBUFFER);
- newfile<<"/PSEARCH,"<<pWorkDir<<endl;
- //处理剩下的内容
- while(!datafile.eof())
- {
- datafile.getline(pBuff,DIRNAMEBUFFER);
- newfile<<pBuff<<endl;
- }
- datafile.close();
- newfile.close();
- SetCurrentDirectory(pApdlDir);//再次将工作目录改为ADPL宏目录
- system("ren start100.ans start100.bak");//备份
- system("ren BB.ans start100.ans");//替换
- SetCurrentDirectory(pWorkDir);//恢复工作目录
- return;
- }
- void CallANSYS(char *pAnsysDir,const char *pANSYSName)//调用ANSYS
- {
- char pLoadDir[DIRNAMEBUFFER];
- char t[]=""";
- char temp[DIRNAMEBUFFER];
- StrLink(t,temp,pAnsysDir);
- StrLink(temp,pLoadDir,"\\bin\\intel\\ansys100" -g -j ");
- StrLink(pLoadDir,pLoadDir,pANSYSName);
- system(pLoadDir);
- return;
- }
- void ClearAPDL(const char * pWorkDir,char * pApdlDir)//恢复APDL宏:通过恢复start文件
- {
- SetCurrentDirectory(pApdlDir);//再次将工作目录改为ADPL宏目录
- system("del start100.ans");//备份
- system("ren start100.bak start100.ans");//替换
- SetCurrentDirectory(pWorkDir);//恢复工作目录
- return;
- }
- int LoadAnsysFrom(const char *pWorkDir,const char *pANSYSName)
- {
- char *pAnsysDir;//ANSYS文件目录
- char pApdlDir[DIRNAMEBUFFER];//APDL的宏设置目录
- if(!(pAnsysDir=getenv("ANSYS100_DIR")))//由环境变量得到ANSYS文件目录
- return 0;
- StrLink(pAnsysDir,pApdlDir,"\\apdl");//修正得到APDL的宏设置目录
- SetAPDL(pWorkDir,pApdlDir); //改写start100.ans文件
- CallANSYS(pAnsysDir,pANSYSName);//调用ANSYS
- ClearAPDL(pWorkDir,pApdlDir);//恢复APDL宏设置
- return 1;
- }
- void LoadANSYSNamed(const char *ANSYSName)//入口函数
- {
- string AdditionCmd(ANSYSName);
- TCHAR _tCurrDir[DIRNAMEBUFFER];
- GetCurrentDirectory(DIRNAMEBUFFER,_tCurrDir);
- string CurrDir(_tCurrDir);//指向创建的文件夹
- string APDLMAC_Dir("\\APDLMAC");//指向APDLMAC
- string AdditionDir("\");
- string ComLineCreatDir("md ");//创建文件夹的命令行
- string ComLineCopyFile("copy *.* ");//拷贝文件的命令行
- //构造各个字符串
- APDLMAC_Dir=CurrDir+APDLMAC_Dir;
- AdditionDir+=AdditionCmd;
- ComLineCreatDir+=AdditionCmd;
- CurrDir+=AdditionDir;
- ComLineCopyFile+=CurrDir;
- //创建文件夹
- system(ComLineCreatDir.c_str());
- //设置当前文件夹为APDLMAC
- SetCurrentDirectory(APDLMAC_Dir.c_str());
- //复制文件
- system(ComLineCopyFile.c_str());
- //设置当前文件夹为用户指定文件夹
- SetCurrentDirectory(CurrDir.c_str());
- //调用ANSYS
- LoadAnsysFrom(CurrDir.c_str(),ANSYSName);
- //恢复用户文件夹
- SetCurrentDirectory(_tCurrDir);
- }
复制代码 5)(最后再啰嗦一下……)如何使用该源代码:
以VC 为例,将如下文件放在一个文件夹中:
CallAnsysSpeci.h
CallAnsysSpeci.cpp
main.cpp
前两个文件是本帖提供的源代码,main.cpp视你所需要的场合而定,例如,可以很简单:
- #include "CallAnsysSpeci.h"
- //主函数
- int main()
- {
- LoadANSYSNamed("Rainyboy");
- return 0;
- }
复制代码 编译后会得到一个应用程序,假设名字为test.exe。要运行此程序,还应按照头文件注释的要求(也是帖子开头的说明)准备如下东西:
- //在之前应该在程序的工作目录中准备:
- //名字为APDLMAC文件夹
- //名字为APDLMAC文件夹,下有宏文件以及PSEARCH.txt文件
- //PSEARCH.txt文件的格式为:
- /*********************************************/
- /* /PSEARCH,
- /* *ABBR,******,******
- /* *ABBR,******,******
- /**********************************************/
- //宏文件的内容为APDL代码
- //后缀为.MAC
- //安装ANSYS10
复制代码 万事俱备之后,就会在程序运行的目录下运行ANSYS,并在其工具栏上显示定制的按钮,当你退出ANSYS时,test.exe程序会自动为你清除对ANSYS的定制。
6)回到开头,那个【界面程序】的流程图:
即对于各个问题的界面程序,生成APDL代码的方式有很多种,但是最后总会逃不了调用ANSYS并定制按钮,这就是我在这里仅仅讨论这一部分内容的原因。
不知道把问题说清楚没有,代码是一年前写的了,有一些冗长,如果用C#或者VB重写,应该要简单一些。
|
评分
-
1
查看全部评分
-
|