基于Qt/ Embedded的DXF文件操作软件的研究与实现

时间:2022-10-07 04:55:20

基于Qt/ Embedded的DXF文件操作软件的研究与实现

摘要:介绍了Qt/Embedded在嵌入式下的应用,通过对DXF文件进行解析,比较了DXF文件与Qt下对应图元参数信息的差异,在Linux系统的Qt Creat平台下开发了关于DXF格式矢量图的操作软件。该软件实现了矢量图形的显示、平移和无极缩放等功能,并将此软件成功移植到ARM平台,完成了PC机上生成的矢量图形文件在嵌入式下的应用。

关键词:Qt/Embedded;DXF;嵌入式;Linux;矢量图

中图分类号:TP316文献标识码:A文章编号:16727800(2012)009008103

1系统开发环境

在进行软件开发之前,首先要搭建系统的开发平台。嵌入式Linux 开发环境一般由如下几部分构成:Linux 服务器(宿主机)、工作站、嵌入式目标系统和将它们连接在一起的网络环境。

本文的宿主机和工作站共处同一个PC机,宿主机使用Virtual Box装载的Debian的Linux系统,用于对应用程序进行交叉编译。工作站则使用Windows系统的终端软件Secure CRT,用于访问嵌入式目标系统。嵌入式目标系统是友善之臂的Tiny6410开发板,也是最终应用程序执行的载体。网络环境采用局域网通信。宿主机交叉编译工具选用armlinuxgcc4.5.1。Linux内核版本采用Linux 2.6.3。系统开发平台的结构如图1。

在嵌入式下进行Qt软件的应用开发,首要任务是将Qt的库文件Qt/Embedded和触摸屏库tslib移植到嵌入式目标系统上。首先在网上下载触摸屏库源码包tslib1.4.tar.gz和Qt4.7.0的源码包qteverywhereopensourcesrc4.7.0.tar.gz,在宿主机上先对触摸屏库tslib1.4进行交叉编译,再将Qt4.7.0进行交叉编译。然后创建一个脚本文件,对相关的库文件设置环境变量,以便在板子上启动Qt时,避免不同版本带来的冲突。最后将宿主机上生成的相应库文件Qt4.7和tslib下载到开发板相应的目录下(宿主机和目标板对应库文件的路径一定要一致)。至此完成了整个系统开发环境的构建。

2DXF文件操作软件设计

在PC机linux系统上安装Qt 软件开发包qtsdklinuxx86opensource2010.02.bin。首先在此平台设计出操作软件的图形界面,然后分析DXF矢量图文件的格式编写出嵌入式平台下的图形接口程序,最后对不同按钮控件的点击信号编写相应的槽函数,实现矢量图形的显示、平移和无极缩放等功能。

2.1矢量图形操作软件的界面设计

新建Qt4 Gui Application工程,将工程命名为Drawing,窗口初始大小设定为目标板液晶显示器分辨率的大小,在此笔者将窗体大小设定为480*272。添加菜单栏和工具栏,在菜单栏和工具栏中分别添加子项预备完成以下功能:新建、打开、显示、隐藏、最佳比例显示、原尺寸显示、固定放大、固定缩小、触控无极缩放、上移、下移、左移、右移。

2.2Qt下DXF文件图形接口的实现

要实现嵌入式系统下的Qt与DXF文件的接口,首先要掌握DXF文件的格式,然后读取文件中的内容,将DXF文件中的图元参数转化为Qt下的图元参数,最后利用Qt的图形输出接口将DXF文件中的全部图元再现。DXF文件的图元信息和Qt下图元信息对照情况如表1。

(1)一个完整的DXF文件应该由七大段组成:标题(header)段、类(classes)段、符号表(tables)段、块(blocks)段、实体 (entities)段、对象(objects)段、文件结束符号(组值为EOF)。对于此软件的设计,我们最为关心的是标题段和实体段。DXF文件的ASCII格式以字符串为单元的,可以进行逐行读取。要实现图形显示、放大和平移,首先要读取Head段中图元的存储图形范围,关键字EXTMIN、EXTMAX分别标示了图形范围的左下角坐标值和右上角坐标值。如果要读取EXTMAX的值,就要先找出组码为9和组码值为“$EXTMAX”的位置,然后连续读取出EXTMAX的X、Y和Z轴的坐标值将其分别存放在extmaxx、 extmaxy 和extmaxz三个变量中。

(2)在DXF文件中,对于ENTllIIES段,可以根据Line、Arc、Circle等关键字分别读出直线、圆弧、圆的图元信息。对于直线,需要读取起点和终点的坐标值;对于圆弧,需要读取所在圆的圆心坐标、半径大小、起始角度和终止角度;对于圆,需要读取圆心坐标和半径大小。因此在读取实体段时,首先定义三种结构体structLine、structCircle和structArc用于存放图元信息;然后,定义一个包含三种图元信息结构的共同体unionData;最后定义一个通用实体结构structCommon来存储各种图形元素,其中structCommon由三部分组成:用于标示图元类型的实体标识字符串Id、包含图元信息结构体的共同体unionData和用于构建structCommon结构体链表的指针*next。相关结构体和共同体定义如下:

//直线结构体的定义

typedef struct structLine{ float x1, y1, z1; float x2, y2, z2; }LINE;

//圆结构体的定义

typedef struct structCircle{ float x, y, z; float radius; }CIRCLE;

//圆弧结构体的定义

typedef struct structArc{ float x, y, z; float radius; float x1, y1; }ARC;

//共同体(包含3种图元结构体)的定义

typedef union unionData{ LINE line; CIRCLE circle; ARC arc ; } union_Data;

//通用实体结构的定义

typedef struct structCommon{char id[15]; union_Data data; struct commonData *next;}EntityData;

(3)图元信息位于实体段,在获取图元信息前,要先找到实体段所在的位置。因为实体段的组码为2,组码值为"ENTITIES",所以可以通过判断语句if(code = 2 && strcmp(codevalue,"ENTITIES")=0)来确定是否读取到实体段。在实体段中,图元的组码均为0,直线、圆和圆弧的组码值分别为“Line”、“Circle”和“Arc”,所以确定直线、圆和圆弧的位置可以分别通过这3条语句来判断:

if(code = 0 && strcmp(codevalue,"LINE")=0)

if(code = 0 && strcmp(codevalue," CIRCLE ")=0)

if(code = 0 && strcmp(codevalue," ARC ")=0)

进入实体段后,循环读取各个图元信息,将不同的图元信息存放在不同的结构体队列中。定义三个通用实体结构EntityData类型的指针*entity_line,*entity_arc,*entity_circle,分别指向三类图元的结构队列,Qt重绘事件将先根据这三个指针所确定的图元信息转化为Qt下绘制相应图元的参数,然后调用Qt的图形接口函数重绘出所有的图形元素。

Qt默认以界面的左上为坐标的原点,X轴向右依次增大,Y轴向下依次增大,而在DXF文件中坐标系的原点位于左下,X轴向右依次增大,Y轴向上依次增大。由于二者定义坐标系不同,因此要将读取到的图元参数进行相应的坐标变换才能得到正确的图形显示。如果设定YQ为Qt下的Y坐标值,YDmax为DXF文件中图元的最大Y轴坐标值,YD为DXF文件中图元的Y轴坐标值,那么相应坐标的对应关系为:YQ=YDmax-YD。

根据表1所示,图元参数的对照情况,进行一定的参数变换。定义的重绘函数void MainWindow::paintEvent(QPaintEvent *)对三类图元的绘制方法如下:

首先定义一个绘图类变量QPainter painter用于调用Qt绘制图形的接口函数,然后定义一个通用实体结构类型的指针EntityData *pointer用于操作三类图元结构体队列,最后得到三种图元在Qt下的接口程序:

//绘制直线(相应参数:起点坐标、终点坐标)

painter.drawLine(pointer>data.line.x1,extmaxypointer>data.line.y1,pointer>data.line.x2,extmaxypointer>data.line.y2);

//绘制圆形(相应参数:外切矩形左上角坐标、矩形长度、矩形宽度)

painter.drawEllipse(pointer>data.circle.xpointer>data.circle.radius,extmaxypointer>data.circle.ypointer>data.circle.radius,2*pointer>data.circle.radius,2*pointer>data.circle.radius);

//绘制圆弧(相应参数:外切矩形、起始角度、跨越角度)

painter.drawArc(rectangle, startAngle, spanAngle);

2.3图形操作按钮的槽函数设计

图形界面的操作主要依靠QT的事件机制进行响应。本软件的图形操作按钮可以归类为:新建、打开、显示、缩放和平移。“新建”就是新增一个操作界面实现多个矢量图形的操作,可以通过MainWindow *other = new MainWindow来创建,调用other>show()显示新建窗口。“打开”是通过加载文件的路径,将DXF 文件中的所有图元进行读取、保存,以便重绘事件对其进行操作。因为图形的显示过程是不断调用Qt重绘事件的过程,所以对于图形操作按钮槽函数的实现是通过改变重绘事件的相应参数,每次调用update()函数对重绘事件加以更新。为此笔者在头文件mainwindow.h中定义了这些控制参数float scale, n, m ; bool draw, open, point。程序设计流程如图2。

在重绘函数中,通过判断open的真值确定是否“打开”装载了图形文件;通过判断draw的真值确定是否“显示”或“隐藏”图形;通过判断point的真值确定是否进行“触控无极释放”;scale决定了图形缩放的倍数。其中m和n的大小控制了平移量的多少,W和H分别表示显示屏的宽度和高度。

对于固定平移操作,以每次平移50像素点的速率进行平移:“固定右平移”操作就是在对应的槽函数on_rightMove_clicked( )中添加m+=50;“固定向上平移”操作则在槽函数on_upMove_clicked( )中添加n50。对于固定缩放操作,以每次放大或缩小1.5倍的速率进行缩放:“固定放大”操作就是在对应的槽函数on_scalingOut_clicked( )中添加scale*=1.5;“固定缩小”操作则在槽函数on_scalingIn_clicked( )中添加scale/=1.5。对于原尺寸显示,就是在相应的槽函数on_original_clicked( )中添加scale=1,m=0,n=0。对于最佳比例显示,则在槽函数on_bestView_clicked( )中添加scale=1/(1.5*((extmaxx/W>extmaxy)? extmaxx/W : extmaxy /H)),m=W/4, n=H/6。

“触控无极缩放”就是通过点击图形上任意两点,将以这两点连线为对角线的矩形区域放大全屏显示。实现的原理:保存两次触控点击的位置坐标,计算出以这两点连线为对角线的矩形区域的宽度和高度,根据显示屏与此矩形区域对应的宽高比确定出合适的缩放倍数scale,再通过scale的值分别确定出X轴方向上的平移参量m和Y轴方向上的平移参量n的值。

3矢量图形操作软件的交叉编译和移植

3.1矢量图形操作软件的交叉编译

在Linux系统下的Qt Creator主界面的左侧,点击“projects”按钮,选择Build Settings,在Edit Build Configuration下拉框中选择“Qt in PATH Release”,然后在Qt version下拉框中选择Qt4.7.0 OpenSource,最后,修改Build Directory为/opt/mini6410/Drawingbuildarm。修改完成后,确认build的设置为Qt in PATH Release,进行交叉编译。编译完成后,产生的可执行文件位于/opt/mini6410/ Drawing buildarm 目录下,文件名为Drawing。

3.2矢量图形操作软件的移植

交叉编译后,软件程序可以通过多种方式将其下载到目标系统上(开发板上),在此是利用NFS挂载的方式进行下载的。首先通过工作站(终端软件SecureCRT)输入挂载命令将Linux系统的/opt/mini6410/ Drawing目录挂载到开发板上的/mnt/nfs目录下,然后将可执行文件Drawing下载到开发板的/mnt/Nand/Qt目录下。至此,矢量图形操作软件的移植工作进行完毕。最后进入目录/mnt/Nand/Qt执行命令./ Drawingqws & 就可以运行此软件。

4结语

本文首先对嵌入式Qt开发平台进行了介绍,然后通过解读DXF文件的图元信息实现了DXF文件在Qt平台下读取,通过对DXF文件和Qt下相应图元信息的比较,实现了图元信息的交换。利用Linux系统下的Qt Creator开发平成了操作软件的设计,通过测试,该软件成功地实现了矢量图形显示、平移和无极缩放等功能。最后将该软件移植到了ARM平台上,成功地完成了嵌入式平台下DXF矢量图形操作软件的开发。

参考文献:

[1]邵平凡,徐霖.基于Qt的嵌入式GUI开发的应用研究[J].工业控制计算机,2011(8).

[2]李驹光.嵌入式Linux开发详解——基于EP93XX 系列ARM[M].北京:清华大学出版社,2006(3).

[3]甘明,陈小亮,张科威.基于DXF的数控切割加工优化算法的研究与实现[J].煤矿机械,2010(5).

[4]张高科,凌卫青.基于DXF文件分析的仿真环境构建[J].机电一体化,2010(2).

[5]贾仕俊.基于QT的数据图形化设计与分析[J].软件导刊,2011(7).

上一篇:维生素B——挽救记忆的灵丹妙药? 下一篇:震惊中外的“六·五大隧道惨案”