功能定制ANSYS工具栏的一种方法WORD_第1页
功能定制ANSYS工具栏的一种方法WORD_第2页
功能定制ANSYS工具栏的一种方法WORD_第3页
功能定制ANSYS工具栏的一种方法WORD_第4页
功能定制ANSYS工具栏的一种方法WORD_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、文档可能无法思考全面,请浏览后下载! 标题: 利用宏功能定制ANSYS工具栏的一种方法(In C/C+) 打印本页作者: Rainyboy    时间: 2010-10-14 22:24     标题: 利用宏功能定制ANSYS工具栏的一种方法(In C/C+)本帖最后由 Rainyboy 于 2010-10-14 22:35 编辑     不知大家有没有这样的经验,有些时候接了某研究所的课题,要求分析某个结构的强度或者寿命,或者再进一步形成这种结构的设计方法。合同中要求我们提供一个【界面程序】,在这个【界面程序】中,设计者只需要输入

2、最原始的【几何参数】、【材料参数】、【载荷参数】,由该【界面程序】直接调用ANSYS进行计算和后处理。    整个过程中不需要直接接触APDL代码,完全是由“点鼠标”和“输入数据”完成。这样的【界面程序】有一个好处,就是使用者不必担心直接修改APDL源程序带来的版本混乱、功能出错等风险,而且比较方便。0)先看一个【界面程序】的例子吧(为某单位开发的某结构计算软件,合同中有保密条款,所以作了些处理):attach46766/attach其他功能不提,当用户按下【开始计算】便会弹出如下对话框:attach46767/attach用户再次按下【确定】后,就会在程序当前运行的目录下

3、生成一个与输入JobName相同的文件夹,并在此文件夹中载入ANSYS,运行后,其工具栏上会出现一些定制的功能按钮,点击这些按钮,就可以执行这些定制功能了(比如“建模”“分网”“求解”和“后处理”),而且还可以根据需要显示对话框:attach46768/attach    这种【界面程序】的核心,在于外部程序中实现对ANSYS的调用和定制,这正是我想在这里和大家分享和探讨的问题。1)定制ANSYS工具栏的流程(也许不是唯一的实现方法):    a) 准备好APDL(这一步通常希望由用户通过【界面程序】设置参数后完成,其实就是在指定的目录按照用户输入的参数

4、生成文件,不是本帖的重点),将后缀名改为.MAC,存放在某个工作目录下。例如有建模代码MODEL.MAC和求解代码SOLU.MAC存放在目录d:/ansyswork下    b) 找到./ANSYS INC/V110/ANSYS/APDL 中的start110.ans文件,在文件的最后加入:          /PSEARCH,          *ABBR,MODEL,MODEL         

5、; *ABBR,SOLU,SOLU     c)启动ANSYS11,设置工作目录为d:/ansyswork,那么ANSYS11启动完毕之后,就会在工具栏上出现MODEL和SOLU的按钮了,点击相应的按钮就相当于执行了对应文件中的APDL代码。     d)将start110.ans所增加的内容删除,避免对其它工作产生影响。17 / 232)编程过程中的几个关键:     a)获得ANSYS的安装目录1. char *pAnsysDir;/ANSYS文件目录2. if(!(pA

6、nsysDir=getenv("ANSYS100_DIR")/由环境变量得到ANSYS文件目录3. return 0;复制代码    b)以命令行方式调用ANSYS并指定JobName1. void CallANSYS(char *pAnsysDir,const char *pANSYSName)/调用ANSYS2. 3. char pLoadDirDIRNAMEBUFFER;4. char t="""5. char tempDIRNAMEBUFFER;6. StrLink(t,temp,pAnsysDir);7. StrL

7、ink(temp,pLoadDir,"binintelansys100" -g -j ");8. StrLink(pLoadDir,pLoadDir,pANSYSName);9. system(pLoadDir);10. return;11. 复制代码3)程序源代码(CallAnsysSpeci.h头文件):1. #ifndef ASSUME_CALL_ANSYS_SPECI_RAINYBOY_200903102. #define ASSUME_CALL_ANSYS_SPECI_RAINYBOY_200903103. /*/4. /*   &#

8、160;                  在指定的目录载入指定的文件调用ANSYS             */5. /*                      范雨 2009年3月23日调试完毕        &

9、#160;                   */6. /*/7. /在之前应该在程序的工作目录中准备:8. /名字为APDLMAC文件夹9. /名字为APDLMAC文件夹,下有宏文件以及PSEARCH.txt文件10. /PSEARCH.txt文件的格式为:11. /*/12. /*          /PSEARCH,13. /*          *

10、ABBR,*,*14. /*          *ABBR,*,*15. /*/16. /宏文件的内容为APDL代码17. /后缀为.MAC18. /安装ANSYS1019. #include <windows.h>20. #include <stdlib.h>21. #include <iostream>22. #include <fstream>23. #include <string>24. using namespace std;25. #define DIRNAME

11、BUFFER 10026. void StrLink(char * pBase,char * pTarget,char *pAdd);/增长字符串27. void StrLink(char * pBase,char * pTarget,const char *pAdd);28. void SetAPDL(const char * pWorkDir,char * pApdlDir);/设置APDL宏:通过改写start文件29. void CallANSYS(char *pAnsysDir,const char *pANSYSName);/调用ANSYS30. void ClearAPDL(co

12、nst char * pWorkDir,char * pApdlDir);/恢复APDL宏:通过恢复start文件31. int LoadAnsysFrom(const char *pWorkDir,const char *pANSYSName);32. void LoadANSYSNamed(const char *ANSYSName);/入口函数33. #endif复制代码4)程序代码(CallAnsysSpeci.cpp文件)1. #include "CallAnsysSpeci.h"2. /流程的具体实现3. void StrLink(char * pBase,ch

13、ar * pTarget,char *pAdd)/增长字符串4. 5. int i,len;6. for(i=0;1;+i)7. 8.   if(pBasei='0')9.    break;10.   pTargeti=pBasei;11. 12. len=i;13. /在末尾加上pAdd14. for(i=0;pAddi!='0'+i)15.   pTargeti+len=pAddi;16. /封口17. pTargetlen+i='0'18. return;19

14、. 20. void StrLink(char * pBase,char * pTarget,const char *pAdd)/增长字符串21. 22. int i,len;23. for(i=0;1;+i)24. 25.   if(pBasei='0')26.    break;27.   pTargeti=pBasei;28. 29. len=i;30. /在末尾加上pAdd31. for(i=0;pAddi!='0'+i)32.   pTargeti+len=pAddi;33

15、. /封口34. pTargetlen+i='0'35. return;36. 37. void SetAPDL(const char * pWorkDir,char * pApdlDir)/设置APDL宏:通过改写start文件38. 39. SetCurrentDirectory(pApdlDir);/将工作目录改为ADPL宏目录40. ifstream oldfile;41. ifstream datafile;42. ofstream newfile;43. char pBuffDIRNAMEBUFFER;44. oldfile.open("start100.

16、ans",ios:in);45. newfile.open("BB.ans",ios:out);46. /复制内容即可47. while (!oldfile.eof()48. 49.   oldfile.getline(pBuff,DIRNAMEBUFFER);50.   newfile<<pBuff<<endl;51. 52. oldfile.close();53. SetCurrentDirectory(pWorkDir);/恢复工作目录54. datafile.open("PSEARC

17、H.txt",ios:in);55. /在第一行加上工作目录56. datafile.getline(pBuff,DIRNAMEBUFFER);57. newfile<<"/PSEARCH,"<<pWorkDir<<endl;58. /处理剩下的内容59. while(!datafile.eof()60. 61.   datafile.getline(pBuff,DIRNAMEBUFFER);62.   newfile<<pBuff<<endl;63. 64. da

18、tafile.close();65. newfile.close();66. SetCurrentDirectory(pApdlDir);/再次将工作目录改为ADPL宏目录67. system("ren start100.ans start100.bak");/备份68. system("ren BB.ans start100.ans");/替换69. SetCurrentDirectory(pWorkDir);/恢复工作目录70. return;71. 72. void CallANSYS(char *pAnsysDir,const char *pAN

19、SYSName)/调用ANSYS73. 74. char pLoadDirDIRNAMEBUFFER;75. char t="""76. char tempDIRNAMEBUFFER;77. StrLink(t,temp,pAnsysDir);78. StrLink(temp,pLoadDir,"binintelansys100" -g -j ");79. StrLink(pLoadDir,pLoadDir,pANSYSName);80. system(pLoadDir);81. return;82. 83. void ClearAP

20、DL(const char * pWorkDir,char * pApdlDir)/恢复APDL宏:通过恢复start文件84. 85. SetCurrentDirectory(pApdlDir);/再次将工作目录改为ADPL宏目录86. system("del start100.ans");/备份87. system("ren start100.bak start100.ans");/替换88. SetCurrentDirectory(pWorkDir);/恢复工作目录89. return;90. 91. int LoadAnsysFrom(const

21、 char *pWorkDir,const char *pANSYSName)92. 93. char *pAnsysDir;/ANSYS文件目录94. char pApdlDirDIRNAMEBUFFER;/APDL的宏设置目录95. if(!(pAnsysDir=getenv("ANSYS100_DIR")/由环境变量得到ANSYS文件目录96.   return 0;97. StrLink(pAnsysDir,pApdlDir,"apdl");/修正得到APDL的宏设置目录98. SetAPDL(pWorkDir,pApdlDi

22、r); /改写start100.ans文件99. CallANSYS(pAnsysDir,pANSYSName);/调用ANSYS100. ClearAPDL(pWorkDir,pApdlDir);/恢复APDL宏设置101. return 1;102. 103. void LoadANSYSNamed(const char *ANSYSName)/入口函数104. 105. string AdditionCmd(ANSYSName);106. TCHAR _tCurrDirDIRNAMEBUFFER;107. GetCurrentDirectory(DIRNAMEBUFFER,_tCurrD

23、ir);108. string CurrDir(_tCurrDir);/指向创建的文件夹109. string APDLMAC_Dir("APDLMAC");/指向APDLMAC110. string AdditionDir("");111. string ComLineCreatDir("md ");/创建文件夹的命令行112. string ComLineCopyFile("copy *.* ");/拷贝文件的命令行113. /构造各个字符串114. APDLMAC_Dir=CurrDir+APDLMAC_Di

24、r;115. AdditionDir+=AdditionCmd;116. ComLineCreatDir+=AdditionCmd;117. CurrDir+=AdditionDir;118. ComLineCopyFile+=CurrDir;119. /创建文件夹120. system(ComLineCreatDir.c_str();121. /设置当前文件夹为APDLMAC122. SetCurrentDirectory(APDLMAC_Dir.c_str();123. /复制文件124. system(ComLineCopyFile.c_str();125. /设置当前文件夹为用户指定文

25、件夹126. SetCurrentDirectory(CurrDir.c_str();127. /调用ANSYS128. LoadAnsysFrom(CurrDir.c_str(),ANSYSName);129. /恢复用户文件夹130. SetCurrentDirectory(_tCurrDir);131. 复制代码5)(最后再啰嗦一下)如何使用该源代码:    以VC 为例,将如下文件放在一个文件夹中:    CallAnsysSpeci.h    CallAnsysSpeci.cpp    main.cpp&

26、#160;   前两个文件是本帖提供的源代码,main.cpp视你所需要的场合而定,例如,可以很简单:1. #include "CallAnsysSpeci.h"2. /主函数3. int main()4. 5. LoadANSYSNamed("Rainyboy");6. return 0;7. 复制代码编译后会得到一个应用程序,假设名字为test.exe。要运行此程序,还应按照头文件注释的要求(也是帖子开头的说明)准备如下东西:1. /在之前应该在程序的工作目录中准备:2. /名字为APDLMAC文件夹3. /名字为APDLMAC文件夹,下有

27、宏文件以及PSEARCH.txt文件4. /PSEARCH.txt文件的格式为:5. /*/6. /*     /PSEARCH,7. /*          *ABBR,*,*8. /*          *ABBR,*,*9. /*/10. /宏文件的内容为APDL代码11. /后缀为.MAC12. /安装ANSYS10复制代码万事俱备之后,就会在程序运行的目录下运行ANSYS,并在其工具栏上显示定制的按钮,当你退出ANSYS时,t

28、est.exe程序会自动为你清除对ANSYS的定制。6)回到开头,那个【界面程序】的流程图:attach46769/attach即对于各个问题的界面程序,生成APDL代码的方式有很多种,但是最后总会逃不了调用ANSYS并定制按钮,这就是我在这里仅仅讨论这一部分内容的原因。不知道把问题说清楚没有,代码是一年前写的了,有一些冗长,如果用C#或者VB重写,应该要简单一些。作者: 有梦的人    时间: 2010-10-20 17:53楼主很厉害.,希望能和你交流这方面的技术啊,能留个联系方式吗? 作者: Rainyboy    时间: 2010-10-20 1

29、8:31回复 有梦的人 的帖子咱们论坛不就是联系方式么 作者: 有梦的人    时间: 2010-10-20 18:36可是即时交流不行啊,呵呵,坛子是会来的,要做的项目和你做得差不多,多多指教 作者: Rainyboy    时间: 2010-10-20 18:44回复 有梦的人 的帖子那你可以先把代码存下来用用,如果不能直接为你的场合所用的话,再根据你的实际情形做一些修改。在使用中有涉及ANSYS相关的问题你可以在这个分区发帖,如果纯粹是编码实现的问题可以到算法与编程语言区探讨。 作者: 有梦的人    时间: 2010-10-2

30、0 18:49已经COPY了,不过想问个ANSYS的,ANSYS10.0进行流固耦合分析时候,怎么找不到FSI相关命令的工具啊,看了帮助说是被其它的代替了,能不能支个招啊 作者: 16443    时间: 2010-10-20 19:54回复 Rainyboy 的帖子如果没有版权问题,可以把源程序也给分享了,好让别人参考你的程序。 作者: Rainyboy    时间: 2010-10-20 20:08回复 16443 的帖子整个界面程序是有版权的,按合同不得向第三方转让。但是这篇帖子所涉及的方法分享给大家没有问题,相应的源代码在文中都贴出来了。之所以不

31、采用附件,是因为代码本身不长,大家即时能看到的话可以提提意见。谢谢你对这部分工作的肯定 作者: bingo_1124    时间: 2010-11-6 21:38这个真的很厉害啊 作者: linderman    时间: 2010-11-9 21:49啧啧 作者: 有梦的人    时间: 2010-11-15 18:01Rainyboy 发表于 2010-10-14 22:24 不知大家有没有这样的经验,有些时候接了某研究所的课题,要求分析某个结构的强度或者寿命,或者再进一 .感觉你的这个程序是对ANSYS的显式调用,为什么 不做成隐

32、式的啊,那样不是更好吗?不用直接在ANSYS窗口界面,只需要对话框输入就行了啊,望赐教啊 作者: Rainyboy    时间: 2010-11-15 19:23回复 11 # 有梦的人 的帖子你说得对,后台调用有后台调用的好处,这种情况下用户完全可以不知道他在使用ANSYS进行计算(当然他得装ANSYS,有点纠结哈),界面程序需要为用户提供非常全面的后处理,满足所有的需求;我贴出来的这个程序运行之后计算结果最终还是在ANSYS里呈现,要说比后台调用好的话就在于用户可以爱怎么做后处理就怎么做后处理,在使用定制化的按钮功能的同时也不妨碍使用ANSYS本身提供的功能,当然,最大

33、的好处就是界面程序不需要提供特别多的后处理功能了。实际上哪个更好我想得看使用场合吧,用户需要什么,咱们就做什么 作者: 有梦的人    时间: 2010-11-15 20:07嗯,是这样的,不过你的程序有的地方我还是有些看不懂,呵呵.,但很想请教你 作者: Rainyboy    时间: 2010-11-15 20:50回复 13 # 有梦的人 的帖子恩,是流程的问题还是语言的问题? 作者: 有梦的人    时间: 2010-11-15 21:11以前看一些介绍二次开发的,都是用CREATEPROCESS,或者是WinExec等函数实

34、现,你的这个,以命令行,也就是说可以显式的调用吗?整个函数都要自己写的吗? 作者: Rainyboy    时间: 2010-11-15 21:17回复 15 # 有梦的人 的帖子我用的是system()函数运行的命令行而已,WinExec也可以啊,主要是调用之前要准备一些相关的工作,比如得到当前路径、写start110.ans文件什么的;调用之后吧又要把start100.ans改回去。你从LoadANSYSNamed()函数开始看,就能明白了。 作者: 有梦的人    时间: 2010-11-15 21:33LoadANSYSNamed()函数中的Ra

35、inyboy也就是你的计算机名吗? 作者: Rainyboy    时间: 2010-11-15 21:41回复 17 # 有梦的人 的帖子不是计算机名字,是随便给的一个名字,这个参数的作用是在当前目录下生成一个同名的文件夹,将这个文件夹作为ANSYS的工作目录而已。 作者: 有梦的人    时间: 2010-11-15 21:55Rainyboy 发表于 2010-11-15 21:17 回复 15 # 有梦的人 的帖子我用的是system()函数运行的命令行而已,WinExec也可以啊,主要是调用之前要准 .谢谢你啊,主任,有不懂的地方,还会骚扰你的

36、啊. 作者: 有梦的人    时间: 2010-11-16 20:10Rainyboy 发表于 2010-11-15 21:17 回复 15 # 有梦的人 的帖子我用的是system()函数运行的命令行而已,WinExec也可以啊,主要是调用之前要准 .为什么当时想到用SYSTEM命令行调用,而不用其它的一些函数来调用啊 作者: Rainyboy    时间: 2010-11-16 21:40回复 20 # 有梦的人 的帖子给出的代码没有包含窗体,要做窗体的话在某个按钮的响应函数里调用LoadANSYSNamed就可以了 作者: 有梦的人  &

37、#160; 时间: 2010-11-24 15:21Rainyboy 发表于 2010-10-14 22:24 不知大家有没有这样的经验,有些时候接了某研究所的课题,要求分析某个结构的强度或者寿命,或者再进一 .你入口函数里面的string AdditionCmd(ANSYSName)函数怎么定义的啊,怎么没有看到作者: Rainyboy    时间: 2010-11-24 16:00回复 22 # 有梦的人 的帖子string AdditionCmd(ANSYSName)这句话是实例化一个名字叫AdditionCmd的string对象,相当于调用的是string:stri

38、ng(const char *)。说白了,不是定义函数,是创建对象。 作者: Rainyboy    时间: 2010-11-24 16:03回复 22 # 有梦的人 的帖子system()调用中的参数意义在ANSYS帮助文档里面有:Operations Guide | Chapter 3. Running the ANSYS Program | 3.1. Starting an ANSYS Session from the Command Level-g 是显示图形界面-j  是指定jobname还有其他的,你查查看看吧 作者: 有梦的人 

39、  时间: 2010-11-24 16:40本帖最后由 有梦的人 于 2010-11-24 16:41 编辑 Rainyboy 发表于 2010-11-24 16:00 回复 22 # 有梦的人 的帖子string AdditionCmd(ANSYSName)弱弱地问一下,string不是一个数据类型吗,怎么能定义成一个类啊 作者: huxiaoqi    时间: 2010-12-6 17:37教研室主任太强大了,向你学习! 作者: 有梦的人    时间: 2010-12-7 10:20研究一下觉得CallAnsysSpeci.cpp文件代码里

40、面56、57两行代码可以不要,不知道LZ怎么看的啊 作者: Rainyboy    时间: 2010-12-7 12:40回复 27 # 有梦的人 的帖子呵呵,/PSEARCH命令指定宏的搜索范围,这里设置的是当前目录,当然ANSYS工作时也会搜索当前目录,所以可以不要。 作者: sd05041212    时间: 2011-3-9 16:53回复 1 # Rainyboy 的帖子学习 作者: chx_pj    时间: 2011-3-29 10:53你好,初来咋到,多多关照。我用宏功能定制ANSYS工具栏时,点击任何一个新建按钮都提

41、示“FRAME-MODEL is not a recognized begin command, abbreviation, or macro.this command will be ignored” ,书上说建立宏文件后直接点击按钮就可以了,不知道为什么不行,可以帮忙解决一下吗,多谢多谢 作者: Rainyboy    时间: 2011-3-29 10:58回复 30 # chx_pj 的帖子你好,你是如何修改start110.ans文件的呢?“FRAME-MODEL”这样的字样是出现在你代码的什么位置? 作者: chx_pj    时间: 2011

42、-3-29 11:00/psearch,d:FrameAnalysis*abbr,model,Frame_model*abbr,pres,Frame_pres*abbr,USUM,Frame_PLOT_USUM*abbr,SEQV,Frame_PLOT_SEQV*ABBR,N,Frame_Axis_Force*abbr,Mx,Frame_Mx*abbr,My,Frame_My*abbr,Mz,Frame_Mz*abbr,AVI_SEQV,Frame_AVI_SEQV 作者: chx_pj    时间: 2011-3-29 11:02非常感谢师兄OR师姐的帮忙,呵呵这个问题弄

43、了好几天了,一直没有解决 作者: chx_pj    时间: 2011-3-29 11:04我是在start110.ans文件的末尾添加的以上命令 作者: Rainyboy    时间: 2011-3-29 15:41回复 34 # chx_pj 的帖子目前的这些操作应该都是对的,你的d:FrameAnalysis都有这些.MAC文件吗?,贴一个Frame_model.MAC的开头几行我看看? 作者: chx_pj    时间: 2011-3-29 17:20!第一步 初始化ANSYS环境finish/clear/filname,De

44、mo_frame/view,1,-0.50,-0.83,0.25   !调整模型显示方位和角度/ang,1,66!第二步 定义门字架的高度与宽度multipro,'start',2*cset,1,3,Height,'Height of Frame:',10*cset,4,6,Width,'Width of Frame:',8multipro,'end'!第三步 选择材料*ASK,N_mat,the Material Type of Frame(1/2),1!第四步 选择门子架的截面形状*ASK,N_sectio

45、n,the Section Type of Frame(1/2),1!第五步 根据参数创建有限元模型*dim,Lxyz,3,3*if,N_section,EQ,1,thenLxyz(1,1)=1,0,-1Lxyz(1,2)=0,0,0Lxyz(1,3)=0,1,0*elseLxyz(1,1)=0,0,0Lxyz(1,2)=1,1,-1Lxyz(1,3)=0,0,0*endif 作者: chx_pj    时间: 2011-3-29 17:25FrameAnalysis文件夹中所有的宏文件都有,上面是建模宏文件的一部分 作者: Rainyboy    时间

46、: 2011-3-29 18:03回复 37 # chx_pj 的帖子我感觉是你的FrameAnalysis目录下那些文件名存错了吧?按你的写法,应该存如下文件名:Frame_model.MACFrame_pres.MACFrame_PLOT_USUM.MACFrame_PLOT_SEQV.MACFrame_Axis_Force.MACFrame_Mx.MACFrame_My.MACFrame_Mz.MACFrame_AVI_SEQV.MAC作者: chx_pj    时间: 2011-3-29 22:00本帖最后由 chx_pj 于 2011-3-29 22:02 编辑 论坛开着忘刷新了,刚看到回复刚刚找到一部分解决办法了,在FrameAnalysis文件中存的宏文件还有一个txt的后缀名,但被隐藏了,调了文件查看才发现。在每个宏文件最开始的位置加入/PMACRO命令建模按钮可以调用宏文件了。多谢rainboy的帮助

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论