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

40 篇文章 1 订阅
30 篇文章 2 订阅

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

效果如下:


  

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在VB.NET读取DXF文件并绘制图形需要使用AutoCAD的ObjectARX库。这个库提供了访问DXF文件内容的接口,可以通过该接口读取DXF文件的图形数据。步骤如下: 1. 安装AutoCAD并添加ObjectARX库的引用 在VB.NET添加ObjectARX库的引用,需要先安装AutoCAD。安装AutoCAD后,在VB.NET项目添加对ObjectARX库的引用。 2. 读取DXF文件的数据 使用ObjectARX库的AcadApplication类打开DXF文件,并获取其的图形数据。可以通过以下代码实现: ``` Dim acadApp As New Autodesk.AutoCAD.Interop.AcadApplication() acadApp.Visible = False Dim doc As Autodesk.AutoCAD.Interop.AcadDocument = acadApp.Documents.Open("C:\test.dxf") Dim modelSpace As Autodesk.AutoCAD.Interop.AcadModelSpace = doc.ModelSpace For Each obj As Object In modelSpace '处理读取到的图形对象 Next ``` 在以上代码,通过AcadApplication类打开DXF文件,获取其的AcadDocument对象,并从获取AcadModelSpace对象。AcadModelSpace对象包含了DXF文件所有的图形对象,可以通过循环遍历来获取每个图形对象。 3. 绘制图形 根据读取到的图形数据,使用VB.NET的绘图库来绘制图形。可以使用System.Drawing.Graphics类来实现,例如: ``` Dim g As Graphics = Me.CreateGraphics() Dim pen As New Pen(Color.Red, 1) For Each obj As Object In modelSpace '获取图形对象的坐标信息 Dim x1 As Double = ... Dim y1 As Double = ... Dim x2 As Double = ... Dim y2 As Double = ... '绘制图形 g.DrawLine(pen, x1, y1, x2, y2) Next ``` 在以上代码,使用Graphics对象创建画布,并使用Pen对象定义绘图样式。通过循环遍历每个图形对象,获取其坐标信息,并使用DrawLine方法绘制直线。 注意:以上代码仅为示例代码,具体实现需要根据DXF文件的图形类型进行调整。同时,需要注意ObjectARX库的使用限制和许可要求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值