用C读取DXF中的直线数量和坐标

来源:互联网 发布:软件项目风险控制ppt 编辑:程序博客网 时间:2024/05/20 06:25

 首先,定义直线、圆的结构体,把它们保存在ineStruct.h中

//#include "lineStruct.h" 

#define STRLEN           60#define DATASIZE       sizeof(EntityData) /*-----每个实体的结构-----*///你可在在此添加其它的实体//为了提高精度,变量可定义为双精度型typedef struct tagLine{    float x1,y1,z1;    float x2,y2,z2;}LINE; typedef struct tagCircle{    float x,y,z;    float radius;}CIRCLE;/*------------------------*/ typedef union specialData{    LINE   line;    CIRCLE circle;}privateData;/*------实体的数据结构-------*/typedef struct commonData{    char id[STRLEN];            /*实体标识字符串*/    char layer[STRLEN];         /*层名字符串*/    privateData data;           /*特有数据块*/    struct commonData *next;    /*用于构建链表*/}EntityData;    //定义完数据结构后,就可以用链表结构来存储实体中有用的信息了。//以下程序为读取实体LINE的有关信息的代码。/*------------------------------------------ *Entity.C 读取实体LINE部分内容。  *-------------------------------------------*/
 然后,在line.cpp中实现读取直线的数量、直线两端端点的坐标

//line.cpp

#include "lineStruct.h" #include <stdio.h>#include <conio.h>#include <stdlib.h>#include <string.h> /*----------函数声明部分-----------*/void print(EntityData *entity);/*---------------------------------*/ int main(int argc,char *argv[]){       int           code;       float value;       char codevalue[STRLEN];             FILE       *dxf;       char filename[STRLEN];       char suffix[6] = ".dxf";        EntityData *entity,*entity1,*entity2;        printf("请输入DXF文件名:");       gets(filename);       strcat(filename,suffix);        dxf = fopen(filename,"r");       if(!dxf) {              printf("打开文件出错!\n可能不存在此文件.\n");              printf("按任意键退出...");              getch();              exit(0);       }       else {              printf("正在读取文件...\n");       }        entity = entity2 = (EntityData *)malloc(DATASIZE);                    while(!feof(dxf)) {              fscanf(dxf,"%d",&code);              fscanf(dxf,"%s",codevalue);               if(code == 2 && strcmp(codevalue,"ENTITIES")==0) {                     while(strcmp(codevalue,"ENDSEC")) {                            fscanf(dxf,"%d",&code);                            fscanf(dxf,"%s",codevalue);                             if(code == 0 && strcmp(codevalue,"LINE")==0) {                                   entity1 = (EntityData *)malloc(DATASIZE);                                    strcpy(entity1->id,codevalue);                                    fscanf(dxf,"%d",&code);                                                                                                                                           while(code) {                                          switch(code) {                                          case 8:                                                 fscanf(dxf,"%s",codevalue);                                                 fscanf(dxf,"%d",&code);                                                 strcpy(entity1->layer,codevalue);                                                 break;                                          case 10:                                                 fscanf(dxf,"%f",&value);                                                 fscanf(dxf,"%d",&code);                                                 entity1->data.line.x1 = value;                                                 break;                                          case 20:                                                 fscanf(dxf,"%f",&value);                                                 fscanf(dxf,"%d",&code);                                                 entity1->data.line.y1 = value;                                                 break;                                          case 30:                                                 fscanf(dxf,"%f",&value);                                                 fscanf(dxf,"%d",&code);                                                 entity1->data.line.z1 = value;                                                 break;                                          case 11:                                                 fscanf(dxf,"%f",&value);                                                 fscanf(dxf,"%d",&code);                                                 entity1->data.line.x2 = value;                                                 break;                                          case 21:                                                 fscanf(dxf,"%f",&value);                                                 fscanf(dxf,"%d",&code);                                                 entity1->data.line.y2 = value;                                                 break;                                          case 31:                                                 fscanf(dxf,"%f",&value);                                                 fscanf(dxf,"%d",&code);                                                 entity1->data.line.z2 = value;                                                 break;                                          default: {                                                 fscanf(dxf,"%s",codevalue);                                                 fscanf(dxf,"%d",&code);                                                         }                                          }                                   }                                                                     entity2->next = entity1;                                   entity2 = entity1;                            }                     }                     entity2->next = NULL;              }       }        entity = entity->next;            //第一个实体区为空,所以使头指针移向下一个实体       print(entity);                        //输出链表     printf("\nPress any key to halt...");    getch();    return 0;} //输出链表void print(EntityData *entity){       int i=0;       EntityData *pointer;        pointer = entity;        if(pointer != NULL) {              do{                     i++;                     pointer = pointer->next;              }while(pointer != NULL);       }        printf("\nOutput LinkList:");       printf("\nDXF文件中总共有%d条直线:\n",i);        i = 1;       pointer = entity;        if(pointer != NULL) {              do{                     printf("第%d条直线:\n",i);                     printf("X1=%f\tY1=%f\tZ1=%f\n",pointer->data.line.x1,                            pointer->data.line.y1,pointer->data.line.z1);                     printf("X2=%f\tY2=%f\tZ2=%f\n",pointer->data.line.x2,                            pointer->data.line.y2,pointer->data.line.z2);                      pointer = pointer->next;                     i++;              }while(pointer !=NULL);       }}

效果如下:


  
参考地址:  http://blog.csdn.net/eryar/article/details/2371755

0 0
原创粉丝点击