天天看点

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

 首先,定义直线、圆的结构体,把它们保存在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);
       }
}
           

效果如下:

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

   参考地址: 

  http://blog.csdn.net/eryar/article/details/2371755

继续阅读