前处理发布时间:2006-08-02 关键字: 处理 有限 应用 文件 fprintf dxf 节点 code wf 网格 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
#include
#include
#include
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(\\\\" the points'number is %d\\\\",nd-1);
for( i=1;i<=(nd-1);i++)
{ fprintf(wf,\\\\"%f\\\\",dotx[i]);
if(i<(nd-1)) fprintf(wf,\\\\",\\\\");
}
fprintf(wf,\\\\"};\\\\");
fprintf(wf,\\\\" float doty[1000]={0,\\\\");
for( i=1;i<=(nd-1);i++)
{ fprintf(wf,\\\\"%f\\\\",doty[i]);
if(i<(nd-1)) fprintf(wf,\\\\",\\\\");
}
fprintf(wf,\\\\"};\\\\");
fclose(wf);
}
void extract()
{
char fname[24];
printf(\\\\" input the name of DXF :\\\\"); 输入dxf文件名
scanf(\\\\"%s\\\\",fname);
strcat(fname,\\\\".dxf\\\\");
if((dxf=fopen(fname,\\\\"r\\\\"))==NULL)
exit(0);}
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
#include \\\\"shuju.h\\\\"
main()
{ FILE *fp;
int i1,i2;
fp=fopen(\\\\"drawout.dxf\\\\",\\\\"w\\\\"); 建立一个图形交互文件
fprintf(fp,\\\\" 0 SECTION 2 ENTITIES \\\\"); 写入实体开始段
for(i1=1;i1<=nsan;i1++)
{
for(i2=0;i2<=2;i2++)
{ fprintf(fp,\\\\" 0 LINE 8 0 \\\\");
fprintf(fp,\\\\" 10 %f \\\\",dotx[sanjiao[i1][i2]-1]);
fprintf(fp,\\\\" 20 %f \\\\",doty[sanjiao[i1][i2]-1]);
fprintf(fp,\\\\" 11 %f \\\\",dotx[sanjiao[i1][i2+1]-1]);
fprintf(fp,\\\\" 21 %f \\\\",doty[sanjiao[i1][i2+1]-1]);
}
}
fprintf(fp,\\\\" 0 ENDSEC 0 EOF \\\\"); 写入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平台上显示生成的网格
五、 结论
从实际应用情况看,本文给出的程序能够方便准确地完成有限元网格生成中边界节点的设置以及显示已生成网格的图形。