但永平,张 蕾,张国涛,杨 凯
(中原工学院 电子信息学院,河南 郑州 450007)
AutoCAD是目前世界上最成功的CAD软件平台之一,它具有齐全的图形编辑功能和直观的系统构架,有丰富的绘图指令、强大的编辑功能,支持多种图形输入、输出设备。同时,AutoCAD具有相当的灵活性,可根据需要进行二次开发[1]。可以通过对AutoCAD的二次开发,使其更广泛的运用于其他工艺过程中。例如,在实际的工程雕刻中,为了设计雕刻的图形,需要在具有齐全的图形编辑功能和直观的系统构架的CAD软件中编辑设计图形,而设计好的图形数据参数要输出到雕刻的控制程序中,进而控制雕刻图形。
尽管AutoCAD是一个功能很强的图形编辑系统。但它所包含的一系列指令只能在AutoCAD状态下工作。为使AutoCAD的图形信息能够读取出来,这就需要将高级语言程序来对它进行参数提取,这实质上就是AutoCAD与高级语言的接口。AutoCAD系统提供有多种接口方式,如.SCR文件、.DXF文件、AutoLisp语言接口等[2]。本文只介绍.DXF文件接口方式。
为此,本文针对在实际的雕刻过程中为有效地读取CAD软件设计图形的数据参数,对DXF文件数据格式,分析DXF文件的组成,根据DXF文件格式,通过C语言的文件管理功能,设计出了C语言与AutoCAD接口程序,在自行开发软件与AutoCAD之间建立起了数据通道,从而实现了数据传递和共享。而本文所应用的雕刻控制平台数控系统是一种新型的数控系统,它用一台PC实现包括插补、伺服等功能在内的所有数控功能,使数控系统的结构大大简化。这样,一台PC机既可用于CAD/CAM设计,又可用于控制雕刻机的运作,大大降低了整套设备的成本。基于本文设计的C语言与AutoCAD接口程序已成功应用在雕刻控制平台数控系统,并取得了满意的结果。
DXF是Drawing eXchange File的缩写,意思为图形交换文件,在工程制图中有广泛的应用,掌握了DXF文件的读写对编写CAD软件时的图形信息的交换有重要意义。它有两种格式:一种是ASCII DXF格式;一种是二进制DXF格式。ASCII DXF文件格式是ASCII文字格式的AutoCAD图形的完整表示,这种文件格式易于被其他程序处理。二进制格式的DXF文件与ASCII格式的DXF文件包含的信息相同,但格式上二进制格式比ASCII格式更精简,能够节省百分之二十五的文件空间且可读性强。
为了与其他软件共享图形数据,AutoCAD提供了DXF(Drawing Interchange Format)文件格式,此格式现已被广泛使用,成为事实上的标准。通过DXF文件格式,可以使用高级语言开发程序读取AutoCAD图形文件,也可以创建DXF文件供AutoCAD打开。DXF一般情况下是文本文件,可以使用文本编辑器(如Windows记事本、写字板)来查看、编辑其内容。
DXF文件是AutoCAD与外部联系的主要接口方式,易于将AutoCAD的图形转换成CAD系统所能读取的文件格式。.DXF文件是一种具有严格格式的顺序文件.是以ASCII码形式存放图形信息的数据文件一个DXF文件包括了对应图形数据库中的所有信息。一个DXF文件可由高级语言程序生成,也可以由绘制的图形使用DXFOUT命令生成该图形的DXF文件。.DXF文件的实质是一组表达具体图形的程序执行指令,只要按照格式标准调用DXF文件并按其组码和组织执行对应的任务,即可将图形重现。
由于DXF一般情况下是文本文件,因此DXF文件可以使用文本编辑器(如Windows记事本、写字板)来查看、编辑其内容。用记事本打开一个DXF文件,可以发现它里面有这样一些代码:
0
SECTION
2
HEADER
9
$ACADVER
1
AC1015
……
即里面总是数字和字符串/数字在交替的出现。数字就叫做代码 (通常称为组码),紧跟组码数字的称为关联值对。DXF文件本质上由代码及关联值对组成。代码(通常称为组码)表明其后的值的类型。使用这些组码和值对,可以将DXF文件组织到由记录组成的区域中,这些记录由组码和数据项目组成。在DXF文件,每个组码和值各占一行。
一个完整的ASCII格式的DXF文件结构如下:
1)标题段(HEADER) 标题段包含图形的基本信息,记录AutoCAD系统的所有标题变量的当前值或当前状态。标题变量记录了AutoCAD系统的当前工作环境,如SNAP捕捉当前状态、栅格间距式样、当前图层层名及线型、颜色等。
2)类段(CLASSES)类段由程序自己定义的各种类。
3)表段(TABLES)表段包含以下符号表的定义:
APPID(应用程序标识表)
BLOCK_RECORD(块参照表)
DIMSTYLE(标注样式表)
LAYER(图层表)
LTYPE(线型表)
STYLE(文字样式表)
UCS(用户坐标系表)
VIEW(视图表)
VPORT(视口配置表)
4)块段(BLOCKS)块段记录了所用块的块名,当前图层层名、块的种类、块的插入基点及组成该块的所有成员。块的种类分为图形块、带有属性的块和无名块3种。无名块包括用HATCH命令生成的剖面线和用DIM命令所完成的尺寸标准。
5)实体段(ENTITIES)实体段记录了每个实体的名称、所在图层及其名字、线型、颜色等。
6)对象段(OBJECTS)。包含图形中的非图形对象。
7)文件结束段(END OF FILE)DXF文件的结束标志。DXF 以”0”、”EOF”结束[3]。
每个段都以一个后跟字符串SECTION的组码0开始,其后是组码2和表示该段名称的字符串 (例如,HEADER)。每个段都由定义其元素的组码和值组成。每个段都以一个后跟字符串ENDSEC的组码0结束。
有些组代码会因表达环境的不同而有多个含义。在分析时需要根据不同的段和不同的表达而判断[4]。表1部分常用的组代码的含义[4],表2直线段的实体描述[5],表3圆的实体描述[5]。
表1 常用组代码的含义Tab.1 Meaning of comm on group of code
表2 直线段的实体描述数据Tab.2 Entity describe data of a line segment
表3 圆的实体描述数据Tab.3 Entity description data of round
从DXF文件中检索,当检索到某个段时就转到那个段的处理程序去处理。如检索到HEADER段就转入HEADER段的处理程序去处理。
图1 DXF文件处理流程Fig.1 Flow chart DXF file handling
图形的大部分信息都在实体ENTITIES段中,因此读取实体段的内容很重要。读取实体段的数据首先要考虑读取数据的存储方式,然后再进行后一步的处理或存入数据文件中。此处用链表结构来存储。
各个实体的数据分成两块:公共数据块和特殊数据块。公共数据块存储每个实体都具有特征参数,如所在图层,实体标识,线型名……。
特殊数据块存储每个实体特有的数据,如实体LINE,它里面有两个端点的坐标值;实体CIRCLE中有圆心坐标值和半径值等。
单个实体的数据处理方法:读取一个实体的数据首先根据组码“0”后的实体标识字符串来确定其为哪一种实体,然后再根据这个实体的具体情况来读取数据。
AutoCAD实体种类很多,每种实体对应一个接口函数,因此,接口程序包含的函数很多。本文仅以直线度和圆为例说明接口程序的设计方法。
为了方便引用,用结构体函数来定义直线和圆。本文目的是将读取到的DXF文件中的直线和圆的信息,显示在屏幕上。
1)直线段的接口程序 读取直线的函数原型定义为:
typedef struct tagLine{
float x1,y1,z1;
float x2,y2,z2;
}LINE;
其中 x1,y1,z1 为直线的起点坐标,x2,y2,z2 为直线的终点坐标。在函数体中调用文件输入输出函数,按照表2示直线段的格式,若读取到组代码为“0”且组值为LINE时,将组代码“10”,“20”,“30”后的起点坐标分别写到 x1,y1,z1 里;最后将组代码“11”,“21”,“31”后的终点坐标分别写到 x2,y2,z2中。
2)圆的接口程序 读取圆的函数原型定义为:
typedef struct tagCircle{
float x,y,z;
float r;
}CIRCLE;
其中x,y,z为圆心坐标,r为圆的半径。在函数体中调用文件输入输出函数,按照表3圆的格式,若读取到组代码为“0”且组值为 CIRCLE 时,将组代码“10”,“20”,“30”后的圆心坐标分别读到 x,y,z里;最后将组代码“40”后的圆的半径读到 r中[6]。
本接口程序比较复杂,在合计时将程序分为主程序和两个子程序来设计。主程序为整个程序的核心部分,它的主要功能是从DXF文件中读取组代码和组值,并将直线的起点及终点坐标和圆的圆心坐标及半径值读取出来,并存入指针中。两个子程序分别是直线和圆的显示程序,直线显示子程序的功能是显示所打开DXF文件中直线的条数,每条直线的起点X坐标、起点Y坐标、起点Z坐标、终点X坐标、终点Y坐标、终点Z坐标。圆的显示子程序的功能是显示所打开DXF文件中圆的个数,每个圆的圆心X坐标、圆心Y坐标、圆心Z坐标以及圆的半径值。
调用接口程序来读取DXF文件中图形信息,要有一定的顺序。图2给出了读取DXF文件中图形信息的过程,具体步骤如下:
第一步:以“读”的方式打开一个文本文件,并获得文件指针dxf。
FILE*dxf; /*定义文件指针dxf*/
dxf=fopen(filename,“r”);/* 打开文件,并获得文件指针 */
图2 读取DXF文件中图形信息流程图Fig.2 Flow chart Read DXF files,graphics information
第二步:从文本中读取字符
fscanf(dxf,"%f",&code);/* 存放组码值 */
fscanf(dxf,"%d",&value);/* 存放字符串 */
第三步:读取几何信息
if(code==0&&strcmp(codevalue,"LINE")==0);/* 读取直线的信息*/
if(code==0&&strcmp(codevalue,"CIRCLE")==0); /* 读取圆的信息*/
第四步:显示子程序
void print1(EntityData*entity1);/* 直线的显示子程序 */void print2(EntityData*entity2);/* 圆的显示子程序 */
第五步:调用子程序
第六步:关闭文本文件。
fclose(dxf); /* 关闭文件 */
此外 DXF以”0”、”EOF”结束,因此在函数中可用 exit(0)、return(0)来表示文件结束。
而 feof(dxf);用来检查文件是否结束,遇文件结束符(0或者EOF)返回非零值,否则返回0[7]。
在AutoCAD中所画的图形(注意:本设计只适用于直线和圆,因此所画的图形只能是直线或者是圆)如图3所示。
图3 AutoCAD中的自定义图形Fig.3 AutoCAD custom graphics
在如图2所示的命令行中输入DXFOUT,则系统会自动生成一个DXF文件,自行命名该DXF文件,将该文件保存在程序生成的可执行文件所在的文件夹中(可执行文件被系统自动放在debug文件夹中)。
再打开可执行文件,即可看到如图4所示的结果。
图4 接口程序生成的可执行文件打开后的界面Fig.4 Interface chart of interface program to generate the executable file to open
接下来可以根据界面上的提示进行操作。界面提示“请输入文件名:”,我们可以输入一个DXF文件的文件名,然后按回车键。
如果文件不能正常打开,界面上将会出现打开文件失败,如果能正常打开,界面上将会出现正在读取文件…。
并且界面将会显示所打开DXF文件中直线的条数,每条直线的起点X坐标、起点Y坐标、起点Z坐标、终点X坐标、终点Y坐标、终点Z坐标以及所打开DXF文件中圆的个数,每个圆的圆心X坐标、圆心Y坐标、圆心Z坐标、圆的半径坐标。
在界面上输入我们所用例子的DXF文件名后,按回车,将会显示如图5所示。
图5 接口程序的实例显示结果Fig.5 Results of interface program examples show
该运行窗口中显示了直线的个数和它们的各个起点和终点坐标以及圆的个数和它们各个圆心坐标和半径值。并且与该DXF文件以记事本打开后的文件中所显示的直线和圆的个数及坐标相对应,由此可见本软件是成功的。
根据DXF文件格式,借助于C语言的文件管理功能,设计出了接口程序。在自行开发软件与AutoCAD之间建立起了数据通道,把AutoCAD中的数据提取出来。在数控加工中应用课提高设计效率,缩短设计周期。
通过该软件可以将在AutoCAD中所画的图形的信息(直线的起点和终点坐标,圆的圆心坐标和半径)提取出来,然后通过一个数控程序将坐标信息传递给数控机床,数控机床[8-9]就能够加工成和在AutoCAD中所画的图形一致的图案。
这样就省去了数控编程来实现加工的麻烦,提高了生产效率。
[1]宋耀增.AutoCAD DXF文件 C语言函数库的研制[J].燕山大学学报,1998,22(4):304-309.SONG Yao-zeng.AutoCAD DXF file Clanguage function library development[J].Journal of Yanshan University,1998,2(4):304-309.
[2]窦宪民.AutoCAD接口技术研究[J].郑州轻工业学院学报:自然科学,2002,17(2):86-88.DOU Xian-min.AutoCAD interface technology research[J].Zhengzhou Light Industry University:Natural Science,2002,17(2):86-88.
[3]陶元芳.C语言命令文件式参数绘图函数集[J].太原重型机械学院学报,2002,23(2):107-112.TAO Yuan-fang.C language command file type parameter drawing function set[J].Taiyuan heavy machinery institute journal,2002,23(2):107-112.
[4]张金萍.DXF接口文件在复杂图形数控加工中的应用[J].沈阳化工学院学报,2004,18(2):152-159.ZHANG Jin-ping.DXF interface files in nc machining of complex graphics application[J].Shenyang Institute of Chemical Journal,2004,18(2):152-159.
[5]邓燕.AutoCAD2004中文版基础与实例教程[M].北京:电子工业出版社,2004.
[6]谭浩强.C语言程序设计[M].3版.北京:清华大学出版社,2005.
[7]夏云龙.VC++深入详解[M].北京:电子工业出版社,2008.
[8]王潇.数控机床大推力永磁同步直线电机控制方法 [J].电子科技,2011(6):124-126.WANGXiao.Study on the control of the high thrust permanent magnet liner synchronous motor used in the numerical control machine[J].Electronic Science and Technology,2011(6):124-126.
[9]李周平.基于直线电机的数控机床驱动控制技术[J].现代电子技术,2012(3):158-160.LI Zhou-ping.Drive control technology of numerical control machine based on linear motor[J].Modern Electronics Technique,2012(3):158-160.