c语言读取dxf的直线信息

代码来源:Open Cascade DataExchange DXF - opencascade - 博客园 (cnblogs.com)

/*------------------------------------------

 *Entity.C 读取实体LINE部分内容。

 *eryar@163.com     02-05-08 19:52

 *-------------------------------------------*/



#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>



#define STRLEN           60

#define DATASIZE       sizeof(EntityData)
#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;



/*----------函数声明部分-----------*/

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);

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值