博客
关于我
autocadR12的格式分析(一)
阅读量:753 次
发布时间:2019-03-22

本文共 2625 字,大约阅读时间需要 8 分钟。

AutoCAD R12的直线和圆格式剖析及代码实现

1. 直线格式

在AutoCAD R12中,直线的数据存储格式采用DXF文件格式,其中直线的 RECORD 8 0 XPICLINES 类型保存在线段信息。具体来说,直线记录的字段包括:

  • 10:x坐标
  • 20:y坐标
  • 11:x2坐标
  • 21:y2坐标
  • 73:插画方向参数
  • 8 0:线宽
  • 62 xx:颜色代码

以下是典型的直线数据示例:

0 SECTION 2 ENTITIES 0LINE 8 0 XPICLINES 0.1862 110 3.000000 20 3.000000 11 5.000000 21 5.000000 0 ENDSEC 0 EOF

2. 圆的格式

在AutoCAD R12中,圆的数据格式同样使用DXF文件格式。相同于直线,圆的 RECORD 8 0 XPICLINES 类型保存圆的信息。然而,圆的字段增加了:

  • 40:半径

因此,圆的记录格式如下:

0 SECTION 2 ENTITIES 0CIRCLE 8 0 XPICLINES 0.1862 110 3.000000 20 3.000000 40 3.000000 0 ENDSEC 0 EOF

需要注意的是,与直线相比,圆记录中缺少某些点序列字段(如73和74),因为圆是通过中心点和半径直接定义的。

3. 代码实现

为了实现有不同颜色和宽度的直线和圆,我们可以编写C语言程序来生成符合DXF格式的代码。以下是实现代码:

#include 
#include
#include
struct Points { char row[10]; // 定义10行 double x, y, z; // 定义点的三个坐标};void LineDXFr(FILE *fp, struct Points start, struct Points end) { fprintf(fp, "0\nLINE\n"); fprintf(fp, "8\n0.18\n"); // 线宽0.18mm fprintf(fp, "62\n1\n"); // 红色线 fprintf(fp, "10\n%f\n20\n%f\n11\n%f\n21\n%f\n", start.x, start.y, end.x, end.y);}void CircleDXF(FILE *fp, struct Points center, double radius) { fprintf(fp, "0\nCIRCLE\n"); fprintf(fp, "8\n0.18\n"); // 线宽0.18mm fprintf(fp, "62\n1\n"); // 红色圆 fprintf(fp, "10\n%f\n20\n%f\n40\n%f\n", center.x, center.y, radius);}void LineDXFg(FILE *fp, struct Points start, struct Points end) { fprintf(fp, "0\nLINE\n"); fprintf(fp, "8\n0.18\n"); // 线宽0.18mm fprintf(fp, "62\n3\n"); // 绿色线 fprintf(fp, "10\n%f\n20\n%f\n11\n%f\n21\n%f\n", start.x, start.y, end.x, end.y);}void LineDXFy(FILE *fp, struct Points start, struct Points end) { fprintf(fp, "0\nLINE\n"); fprintf(fp, "8\n0.18\n"); // 线宽0.18mm fprintf(fp, "62\n2\n"); // 黄色线 fprintf(fp, "10\n%f\n20\n%f\n11\n%f\n21\n%f\n", start.x, start.y, end.x, end.y);}int main() { struct Points po1 = {"1", 3, 3, 3}; struct Points po2 = {"2", 5, 7, 5}; struct Points po3 = {"3", 8, 9, 8}; struct Points po4 = {"4", 10, 13, 10}; FILE *fp; fp = fopen("lineall3d.dxf", "w"); if (fp == NULL) { printf("无法打开文件 !\n"); return; } fprintf(fp, "0\nSECTION\n"); fprintf(fp, "2\nENTITIES\n"); // 画红色的直线 LineDXFr(fp, po1, po2); // 画绿色的直线 LineDXFg(fp, po3, po4); // 画黄色的直线 LineDXFy(fp, po2, po3); // 画红色的圆 CircleDXF(fp, po1, 3); fprintf(fp, "0\nENDSEC\n"); fprintf(fp, "0\nEOF"); fclose(fp); return 0;}

4. 代码说明

  • LineDXFr 函数绘制红色圆线,使用指定的线宽。
  • CircleDXF 函数绘制红色圆,中心坐标和半径由参数提供。
  • LineDXFgLineDXFy 分别绘制绿色和黄色的直线。
  • 主函数中包含了创建点结构和文件操作,同时调用各个绘制函数,生成最终的DXF文件。

这种代码可以根据需求调整颜色和线宽,而无需手动操作,适合自动化处理需要生成符合特定格式的几何图形的场景。

转载地址:http://bkgwk.baihongyu.com/

你可能感兴趣的文章
Netty源码—5.Pipeline和Handler二
查看>>
Netty源码—6.ByteBuf原理一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty源码—8.编解码原理一
查看>>
Netty源码—8.编解码原理二
查看>>
Netty源码解读
查看>>
netty的HelloWorld演示
查看>>
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
查看>>
Netty的网络框架差点让我一夜秃头,哭了
查看>>
Netty相关
查看>>
Netty简介
查看>>
Netty线程模型理解
查看>>
netty解决tcp粘包和拆包问题
查看>>
Netty速成:基础+入门+中级+高级+源码架构+行业应用
查看>>
Netty遇到TCP发送缓冲区满了 写半包操作该如何处理
查看>>
netty(1):NIO 基础之三大组件和ByteBuffer
查看>>
Netty:ChannelPipeline和ChannelHandler为什么会鬼混在一起?
查看>>
Netty:原理架构解析
查看>>