基于AutoCAD的全站仪数据导入系统的设计与实现林琳

(整期优先)网络出版时间:2017-12-22
/ 2

基于AutoCAD的全站仪数据导入系统的设计与实现林琳

林琳

辽源职业技术学院资源工程系吉林辽源136200

摘要:随着数字化测绘技术的普及,全站仪这一最常规的测量仪器越来发挥更大的作用。但由于仪器厂商仅提供传输软件,采集到的数据和编码在许多测量成图软件中无法直接读取。通用的数据下载与转换程序在市场上还比较缺乏。为了满足全站仪数据传输的需要,本文详细介绍了基于AutoCAD的全站仪数据导入系统的设计与实现,该系统利用串口通信控件MSComm,编写了通讯程序,实现了计算机与全站仪的数据通信,并通过ObjectARX对AutoCAD进行二次开发,实现了数据文件的展点,本文以拓普康GTS102N全站仪为例,利用相应算法。从原始数据中提取有用数据,并可在AutoCAD下通过展点成图。

关键词:串口通信;数据传输;MSComm控件;AutoCAD二次开发

1串行通信与MSComm控件简介

串行通信是数据通过一根传输线逐位传送,数据传送按位顺序进行,至少只需要一根传输线即可完成,在远程传输时,避免了多条线路特性的不一致并被广泛采用[2]。

Microsoft公司在VC++6.0中提供了1个简称MSComm的ActiveX控件,在应用程序中嵌入MSComm控件,只需要获取和设置相应的MSComm控件属性就可以方便地进行微机串口的通讯操作。

2ObjectARX开发技术

ObjectARX是AutoDesk公司针对AutoCAD平台上的二次开发而推出的一个开发软件包[3]。ObjectARX应用程序是一个动态链接库,它与AutoCAD共享地址空间,能够创建能够全面享受AutoCAD固有命令特权的新命令。

3系统总体功能设计

3.1总体结构流程

本系统分为三大功能模块,即通讯模块、数据提取模块、展点模块!

Fig.3-1Thediagramofgeneralmodule

3.2相关模块功能

1)通讯模块:实现原始数据下载的功能。

2)数据提取模块:从复杂的数据中提取所需格式的数据,供AutoCAD下展点使用。

3)展点模块:将步骤2)提取的坐标数据在AutoCAD下展点。

4关键技术

Fig.4-1Thediagramofcommucationmodule

1)第一步启动VC++6.0,用MFCAppWizard新建一个单文档的应用程序DataComm。

2)第二步插入串口控件。

3)第三步建立对话框资源并将其ID命名为ID_DATACOMM_DIG!

Fig.4-2Datacommdialogbox

用ClassWizard生成对话框类CcommutiDlg。建立菜单资源并在CDataCommView中增加消息处理函数OnCommDlg()。

4)第四步在CDataCommView中增加变量

CcommutiDlg*m_pCommutiDlg;

Cstringm_Name,m_Ghight;

Cstringm_DataX,m_DataY;

5)第五步在CDataCommView.cpp中定义CdataCommView类型的全局变量指针m_pView,并在构造函数中赋初值。CommutiDlg.cpp文件,在文件头部定义定义unsignedchar类型的存储数据的数组RecvData[800]以及staticint类型的全局变量ReceievePointer,并赋给初值0,对全局变量m_pView进行引用说明。在OnInitDialog()函数对串口进行初始化。部分代码如下:

m_Comport.SetCommport(1);//选择COM1

if!(m_Comport.GetPortOpen())

m_Comport.SetPortOpen(TRUE);//打开串口

m_Comport.SetSettings("9600,8,1");//参数

m_Comport.SetRThreshold(1);

//RThreshold参数设为1,表示每当串口接收//缓冲区中有多于或等于1个字符时将引发

//一个关于comEvReceive接收数据的//OnComm事件[4]

m_Comport.GetInput();//先预读缓冲区以清

//除残留数据

returnTRUE;

6)第六步添加处理OnComm事件的处理函数OnCommMscomm主要内容如下:

定义一个VARIANT类型的变量vResponse,和int类型的变量k,通过if语句判断判断当前串口的GetCommEvent()函数返回值是否为comEvReceieve事件,如果有则首先通过GetInBufferCount()函数获得接收缓冲区的字节数赋值给变量k,在k大于0的情况下,读取接收到的数据,并调用保存函数ReceieveData()。

7)第七步进行数据的存储,在定义的CcommutiDlg类中添加ReceieveData()成员函数,函数定义,该函数将数据存入事先定义的全局变量RecvData[8000]中,主要内容如下:

for(inti=0;i<Count;i++)

RecvData[i+ReceievePointer]=pbVal[i];ReceievePointer+=Count;

ProcessData();//在保证缓冲区有数据的情况、//下,处理收到的数据

4.2数据提取模块的实现

1)首先在ProcessData()函数中定义int类型变量i=0,并调用While循环语句,每循环一次i值自动加1,直到找到数据的起始位置。

3)在ProcessData()函数,通过for循环语句进行坐标与点名数据的提取。

最后,调用ProcessData()函数,该函数的功能是用传过来的数据进行文件写操作(使用CFile类的Open()函数来创建和打开文件,Write()函数来写文件)将数据存为展点格式文件。

4.3展点模块的设计与实现

Fig.4-3Thediagramoffairpointmodule

1)安装AutoCAD2008软件、ObjectARX2008开发包及开发向导。

2)建立项目,并在文件Commands.cs中定义新的命名空间sy,在该命名空间定义了一个sbd展点命令用来调用test类中的Sbd()函数。

3)建立test类并添加成员函数sbd(),在函数sbd()中,首先调用打开文件对话框,通过该对话框可以打开存放在具体位置的数据文件,如果文件被正确打开,则使用while循环语句逐行读取数据,在当前行数据非空的情况下,把读取到的坐标数据和点名分别存储在事先定义好的数组point3dCol和ptNum中!

5结论

本文实现了对全站仪与计算机的数据传输并利用ObjectARX对AutoCAD进行二次开发,设计并实现了基于AutoCAD的全站仪数据导入程序,满足了从原始数据的下载到数据的提取,直至在AutoCAD下按照要求展点。一定程度上简化内业操作步骤,从而减小了错误和提高数字化测量内业处理效率。

由于使用全站仪采集到的数据格式因生产厂家的不同而不同。对不同的全站仪和成图软件可根据其数据格式,可对程序进行修改和扩充,编成全站仪和成图软件之间的通用接口软件。

参考文献:

[1]宋伟东,张永彬.数字测图原理与应用[M].北京:教育科学出版社,2002.

[2]李现勇.VisualC++串口通信技术与工程实践[M].人民邮电出版社,2002.

[3]李长勋.AutoCADObjectARX程序开发技术[M].北京:国防工业出版社,2005