CAD中DXF文件翻译为SCR文件

来源:互联网 发布:java数据结构排序算法 编辑:程序博客网 时间:2024/05/09 05:27
#include<STDIO.H>#include<STDLIB.H>#include<STRING>#include<MATH.H>#define PI 3.14159265//用UltradiusaEdit打开DXF文件,查找LINE、CIradiusCLE等命令可以可发现,LINE到坐标点之间有//12行的无用信息,转换成SCradius时,需要忽略掉void Ignor(FILE *fp,int n,char name[80],char value[80]){for(int i=0;i<n;i++)//读取2n行,但是不读入到fp2{fgets(name,80,fp);fgets(value,80,fp);}}int main(){FILE *fp1,*fp2;double temp,pointx,pointy,pointz,radius;//temp用来存LINE等命令中的坐标值,pointx、pointy用来存取CIRCLE//ARC等命令中的圆心坐标,radius用来存取圆的半径;int vertex;//存储多义线中的顶点数int closetag;//用于判断多义线时候封闭,closetag=1为封闭状态,closetag=0则不封闭char name[80],value[80];fp1=fopen("test.dxf","r");fp2=fopen("Translated.scr","w");//创建并打开SCR文件if (fp1==NULL){printf("1Can not open this file!\n");return 0;}if (fp2==NULL){printf("2Can not open this file!\n");return 0;}while(!feof(fp1)){fgets(name,80,fp1);fgets(value,80,fp1);if (strcmp(value,"POINT\n")==0)//找到POINT命令{Ignor(fp1,6,name,value);//跳到表示坐标的行temp=atof(value);//获取点X坐标fprintf(fp2,"point %lf,",temp);//写入X坐标Ignor(fp1,1,name,value);//跳到表示Y坐标的行temp=atof(value);//获取Y坐标fprintf(fp2,"%lf,",temp);//写入Y坐标Ignor(fp1,1,name,value);//跳到表示Z坐标的行temp=atof(value);//获取Z坐标fprintf(fp2,"%lf\n",temp);//写入Z坐标}if (strcmp(value,"LINE\n")==0)//处理LINE命令{Ignor(fp1,6,name,value);//跳至坐标表示行temp=atof(value);//获取线起点X坐标fprintf(fp2,"line %lf,",temp);//写入X坐标Ignor(fp1,1,name,value);//跳到Y坐标表示行temp=atof(value);//获取Y坐标fprintf(fp2,"%lf,",temp);//写入Y坐标Ignor(fp1,1,name,value);//跳至Z坐标表示行temp=atof(value);//获取Z坐标fprintf(fp2,"%lf ",temp);//写入Z坐标//接下来对LINE的终点进行操作Ignor(fp1,1,name,value);temp=atof(value);fprintf(fp2,"%lf,",temp);Ignor(fp1,1,name,value);//跳到Y坐标表示行temp=atof(value);//获取Y坐标fprintf(fp2,"%lf,",temp);//写入Y坐标Ignor(fp1,1,name,value);//跳至Z坐标表示行temp=atof(value);//获取Z坐标fprintf(fp2,"%lf \n",temp);//写入Z坐标}if (strcmp(value,"CIRCLE\n")==0)//处理CRICLE命令{Ignor(fp1,6,name,value);pointx=atof(value);//获取圆形坐标Xfprintf(fp2,"circle %lf,",pointx);Ignor(fp1,1,name,value);pointy=atof(value);//获取圆心坐标Yfprintf(fp2,"%lf,",pointy);Ignor(fp1,1,name,value);pointz=atof(value);//获取圆心坐标Zfprintf(fp2,"%lf ",pointz);Ignor(fp1,1,name,value);radius=atof(value);//获取半径fprintf(fp2,"%lf\n",radius);}if (strcmp(value,"ARC\n")==0)//处理ARC命令{Ignor(fp1,6,name,value);pointx=atof(value);//获取圆弧圆心X坐标fprintf(fp2,"arc c %lf,",pointx);Ignor(fp1,1,name,value);pointy=atof(value);//获取圆弧圆心Y坐标fprintf(fp2,"%lf,",pointy);Ignor(fp1,1,name,value);pointz=atof(value);//获取圆弧圆心Z坐标fprintf(fp2,"%f ",pointz);Ignor(fp1,1,name,value);radius=atof(value);//获取圆弧半径值Ignor(fp1,2,name,value);temp=atof(value);//圆弧起始角度fprintf(fp2,"%f,%f ",(cos(temp*PI/180.0))*radius+pointx,(sin(temp*PI/180.0))*radius+pointy);//写入圆弧起点Ignor(fp1,1,name,value);temp=atof(value);fprintf(fp2,"%f,%f\n",(cos(temp*PI/180.0))*radius+pointx,(sin(temp*PI/180.0))*radius+pointy);//写入圆弧终点}if (strcmp(value,"LWPOLYLINE\n")==0)//处理多义线命令{Ignor(fp1,6,name,value);vertex=(int)(atof(value));//获取顶点数Ignor(fp1,1,name,value);closetag=(int)(atof(value));//获取多义线封闭状态Ignor(fp1,1,name,value);fprintf(fp2,"pline ");for (int i=0;i<vertex;i++){Ignor(fp1,1,name,value);temp=atof(value);//读取顶点X坐标fprintf(fp2,"%lf,",temp);Ignor(fp1,1,name,value);temp=atof(value);//读取顶点Y坐标fprintf(fp2,"%lf ",temp);}if (closetag==1)//如果是封闭的就输出C命令{fprintf(fp2,"c\n");}elsefprintf(fp2,"\n");}}fprintf(fp2,"zoom e ");fclose(fp1);fclose(fp2);//关闭两个文件return 0;}

原创粉丝点击