用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
- 用C读取DXF中的直线数量和坐标
- 用C读取DXF文件
- 用C读取DXF文件
- 用C读取DXF文件
- 用C读取DXF文件
- dxf中的圆与直线
- dxf结构解析及读取坐标
- C/C++读取DXF文件源码
- dxfgrabber简单读取dxf文件中的多行文本和单行文本信息
- C和C++中读取不定数量的输入数据
- C读取文本坐标
- GIS系统里DEM文件和DXF文件读取。
- C++读取和生成dxf文件(一)
- 用 SQL 脚本读取Excel 中的sheet数量及名称
- C# 读取DXF文件
- 读取DXF格式文件
- 如何读取DXF格式文件?
- 读取DXF格式文件
- Android4.0-Fragment框架实现方式剖析(一)
- yum只更新安全补丁操作方法
- 责任链模式
- Linux netstat命令学习
- 最优乘车
- 用C读取DXF中的直线数量和坐标
- webApp开发(二)-新建空白页面
- Unity3D研究之自制批量关联材质与贴图插件
- usbview 源码结构分析
- ios怎么回收键盘
- #pragma pack()
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 可重复性研究week2
- Unable to resolve 'JNDI_EcsReadUpf'. Resolved ''; remaining name