找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 605|回复: 0

[分享]:AutoCAD 在有限元前处理中的应用

[复制链接]
发表于 2004-8-6 08:36:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
AutoCAD 在有限元前处理中的应用

国防科技大学航天与材料工程学院 沈军

AutoCAD是一种通用的交互式图形软件。对AutoCAD进行二次开发,通过获取AutoCAD系统提供的用于图形信息交换的文件(文件扩展名为“.dxf”),并且编制相应的接口程序,可以方便地进行有限元分析的边界节点的设置,还可利用AutoCAD平台显示已生成的网格,这样大大减轻了有限元分析师的工作量,并能随时控制生成网格的品质。

  一、边界节点的自动划分

  1.节点的设置

  利用AutoCAD为用户提供的“Point Style”菜单命令,设置节点的显示状态和尺寸大小,设置对话框如图1所示。执行键盘输入命令格式如下:Command: Ddptype(键盘输入)。

  图 1 Point Style设定对话框

  选择点的类型可以通过选择图形菜单中的点,并且在“Point Size”编辑框中设定点的大小。

  2.等分对象

  使用“Divide”命令实现等分对象。

  Command: _divide (或键盘输入Divide命令);

  Select object to divide: (选择等分对象);

  Enter the number of segments or[block]: (用户输入等分数);

  可等分对象包括直线、圆、圆弧、椭圆、椭圆弧、多义线和样条曲线。为了控制网格密度,可以在图形上加入控制点,如图2所示。

  图2 边界线等分及设置网格密度控制点

  3.文件保存

  将图形文件保存为DXF文件。

  Command: Dxfout (键盘输入)

  将弹出“Save Drawing As”对话框,输入文件名即可。

  二、获取边界节点坐标的接口程序

  #include<string.h>

  #include<stdio.h>

  #include<alloc.h>

  #include<process.h>

  void extract(void);

  void extpoint(void);

  void output(void);

  float dotx[1000],doty[1000]; 存储节点坐标的数组

  FILE *dxf,*wf ; 文件指针说明

  int nl=0,nd=1;

  char value[64];

  int code;

  main()

  {

  extract();  获取节点坐标的子程序 

  output();  输出节点信息的子程序

  }

  void output()

  { int i;

  wf=fopen("shuju.dat","w") ; 节点信息保存在文件“shuju.dat”里

  fprintf(wf,"float dotx[1000]={0,"};依照C语言格式输出数据

  printf("\nthe points'number is %d",nd-1);

  for( i=1;i<=(nd-1);i++)

  { fprintf(wf,"%f",dotx);

  if(i<(nd-1)) fprintf(wf,",");

  }

  fprintf(wf,"};");

  fprintf(wf,"\nfloat doty[1000]={0,");

  for( i=1;i<=(nd-1);i++)

  { fprintf(wf,"%f",doty);

  if(i<(nd-1)) fprintf(wf,",");

  }

  fprintf(wf,"};");

  fclose(wf);

  }

  void extract()

  {

  char fname[24];

  printf("\ninput the name of DXF :"); 输入dxf文件名

  scanf("%s",fname);

  strcat(fname,".dxf");

  if((dxf=fopen(fname,"r"))==NULL)

  {printf("fail\n");

  exit(0);}

  printf("\nok!\n");

  do{

  do{

     fscanf(dxf,"%d",&code);

     fscanf(dxf,"%s",value);

     }while((code!=0)||strcmp(value,"SECTION")!=0);说明实体段开始

  fscanf(dxf,"%d",&code);

  fscanf(dxf,"%s",value);

  }while((code!=2)||strcmp(value,"ENTITIES")!=0);

  do{

  fscanf(dxf,"%d",&code);

  fscanf(dxf,"%s",value);

  if(code==0&&strcmp(value,"POINT")==0) extpoint(); “code”和 “POINT”为说明点的组代码及跟随值

  }while((code!=0)||(strcmp(value,"ENDSEC")!=0));说明实体段结束

  fclose(dxf);

  }

  void extpoint(void) 获取节点的坐标

  { do{

  fscanf(dxf,"%d",&code);

  if(code==10)   获取X轴坐标

  fscanf(dxf,"%f",&dotx[nd]);

  else {if(code==20){fscanf(dxf,"%f",&doty[nd]);nd++;} 获取Y轴坐标

       else fscanf(dxf,"%s",value);

       }

  }while(code!=20);

  }

  三、在AutoCAD平台上显示网格的接口程序

  #include<stdio.h>

  #include "shuju.h" 

  main()

  { FILE *fp;

  int i1,i2;

  fp=fopen("drawout.dxf","w");  建立一个图形交互文件

  fprintf(fp," 0\nSECTION\n 2\nENTITIES\n"); 写入实体开始段

  for(i1=1;i1<=nsan;i1++)

  {

    for(i2=0;i2<=2;i2++)

    { fprintf(fp," 0\nLINE\n 8\n0\n");

     fprintf(fp," 10\n%f\n",dotx[sanjiao[i1][i2]-1]);

     fprintf(fp," 20\n%f\n",doty[sanjiao[i1][i2]-1]);

     fprintf(fp," 11\n%f\n",dotx[sanjiao[i1][i2+1]-1]);

     fprintf(fp," 21\n%f\n",doty[sanjiao[i1][i2+1]-1]);

     }

  }

  fprintf(fp," 0\nENDSEC\n 0\nEOF\n"); 写入DXF文件结束段

  fclose(fp);

  }

  四、程序说明

  AutoCAD可以接受缺少任意一些表、段的DXF文件,因此,编写只生成“ENTITIES”段和文件结尾的DXF文件,可以方便地写入显示三角形网格的DXF文件。头文件shuju.h里包含有已生成的网格各三角形单元的的顶点编号,它们保存在数组sanjiao[1000][4]以及三角形单元的总数nsan,各节点的坐标dotx[1000],doty[1000]。程序运行后生成AutoCAD能够识别的DXF文件,文件名为”drawout.dxf”。

  在AutoCAD的“Command:”提示下,调用DXFIN命令,导入drawout.dxf,即可得到生成网格的图形,如图3所示。

  图3 在AutoCAD平台上显示生成的网格

  五、 结论

  从实际应用情况看,本文给出的程序能够方便准确地完成有限元网格生成中边界节点的设置以及显示已生成网格的图形。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-14 06:19 , Processed in 0.401432 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表