📄 deforoberdlg.cpp
字号:
// DeforoberDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "Deforober.h"
#include "DeforoberDlg.h"
#include <cmath>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define PI acos(-1.0)
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CDeforoberDlg 对话框
CDeforoberDlg::CDeforoberDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDeforoberDlg::IDD, pParent)
, strPA("0.0000")
, strPB("0.0000")
, strZenA("0.0000")
, strZenB("0.0000")
, RadPA("")
, RadPB("")
, RadZA("")
, RadZB("")
, dot(".")
, comma(",")
, strEA("")
, strEB("")
, strNA("")
, strNB("")
, strHA("")
, strHB("")
,strShow("")
, lpszPathName("")
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDeforoberDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_PA, strPA);
DDX_Text(pDX, IDC_EDIT_P2, strPB);
DDX_Text(pDX, IDC_EDIT_ZEN_A, strZenA);
DDX_Text(pDX, IDC_EDIT_ZEN_B, strZenB);
DDX_Control(pDX, IDC_MSCOMM2, m_comcl);
//DDX_Control(pDX, IDC_MSCOMM2, m_comcl);
DDX_Control(pDX, IDC_DATETIMEPICKER, m_conTime);
}
BEGIN_MESSAGE_MAP(CDeforoberDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON_OBSERVE, &CDeforoberDlg::OnBnClickedButtonObserve)
ON_BN_CLICKED(IDC_BUTTON_PATH, &CDeforoberDlg::OnBnClickedButtonPath)
ON_BN_CLICKED(IDC_BUTTON1, &CDeforoberDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON_TIME_OBER, &CDeforoberDlg::OnBnClickedButtonTimeOber)
ON_WM_TIMER()
END_MESSAGE_MAP()
// CDeforoberDlg 消息处理程序
BOOL CDeforoberDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
//
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
// 打开端口
m_comcl.SetPortOpen(1);
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CDeforoberDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CDeforoberDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CDeforoberDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CDeforoberDlg::OnBnClickedButtonObserve()
{
// 有了路径文件名才开测,便于结果保存
if (lpszPathName!="")
{
Dms2Rad();
// 开机,参数1为可远程控制
CString str="\n%R1Q,111:1\r\n";
m_comcl.SetOutput(COleVariant(str));
MesureA();
MesureB();
// 关机,参数0,关死而不是休眠1
str="\n%R1Q,112:0\r\n";
m_comcl.SetOutput(COleVariant(str));
OutPut();
}
else
{
MessageBox("请先指定保存路径!","Caution!");
}
// TODO: 在此添加控件通知处理程序代码
}
BEGIN_EVENTSINK_MAP(CDeforoberDlg, CDialog)
ON_EVENT(CDeforoberDlg, IDC_MSCOMM2, 1, CDeforoberDlg::OnCommMscomm2, VTS_NONE)
END_EVENTSINK_MAP()
//////////////////////////////////////////////////////////////////////////
/************************************************************************/
/* 获取用户所选择的路径及文件名以用来保存观测结果 */
/************************************************************************/
void CDeforoberDlg::OnBnClickedButtonPath()
{
CFileDialog fdlg(FALSE);// TODO: 在此添加控件通知处理程序代码
fdlg.m_ofn.lpstrTitle="指定数据保存路径";
fdlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0";
fdlg.m_ofn.lpstrDefExt="*.txt";
if (IDOK==fdlg.DoModal())
{
lpszPathName=fdlg.GetPathName();
}
}
void CDeforoberDlg::Dms2Rad()
{
UpdateData(TRUE);
CString dA("");
CString mA("");
CString sA(""),dB(""),mB(""),sB("");
int i=0;
// 度、分、秒分开
CString dZA,mZA,sZA,dZB,mZB,sZB;
// 参与运算的角数值
double valdA,valmA,valsA,valdB,valmB,valsB;
double valdZA,valmZA,valsZA,valdZB,valmZB,valsZB;
// 拆开提取A方向的度分秒
while (strPA[i]!=dot)
{
dA+=strPA[i];
i++;
}
mA=strPA[i+1];
mA+=strPA[i+2];
sA=strPA[i+3];
sA+=strPA[i+4];
sA+=".";
for (i=i+5;i<strPA.GetLength();i++)
{
sA+=strPA[i];
}
// 拆开提取B方向的度分秒
i=0;
while (strPB[i]!=dot)
{
dB+=strPB[i];
i++;
}
mB=strPB[i+1];
mB+=strPB[i+2];
sB=strPB[i+3];
sB+=strPB[i+4];
sB+=".";
for (i=i+5;i<strPB.GetLength();i++)
{
sB+=strPB[i];
}
// 拆开提取A竖直角的度分秒
i=0;
while (strZenA[i]!=dot)
{
dZA+=strZenA[i];
i++;
}
mZA=strZenA[i+1];
mZA+=strZenA[i+2];
sZA=strZenA[i+3];
sZA+=strZenA[i+4];
sZA+=".";
for (i=i+5;i<strZenA.GetLength();i++)
{
sZA+=strZenA[i];
}
// 拆开提取B竖直角的度分秒
i=0;
while (strZenB[i]!=dot)
{
dZB+=strZenB[i];
i++;
}
mZB=strZenB[i+1];
mZB+=strZenB[i+2];
sZB=strZenB[i+3];
sZB+=strZenB[i+4];
sZB+=".";
for (i=i+5;i<strZenB.GetLength();i++)
{
sZB+=strZenB[i];
}
// 字符串转数值
valdA=atof(dA);
valdB=atof(dB);
valmA=atof(mA);
valmB=atof(mB);
valsA=atof(sA);
valsB=atof(sB);
valdZA=atof(dZA);
valdZB=atof(dZB);
valmZA=atof(mZA);
valmZB=atof(mZB);
valsZA=atof(sZA);
valsZB=atof(sZB);
// 巧妙解决角度为负问题// 字符串型弧度值
int signA=1;
if (valdA<0)
{
signA=-1;
}
double direA=PI/180*(valdA*signA+valmA/60+valsA/3600)*signA;
RadPA.Format("%.10f",direA);
int signB=1;
if (valdB<0)
{
signB=-1;
}
double direB=PI/180*(valdB*signB+valmB/60+valsB/3600)*signB;
RadPB.Format("%.10f",direB);
int signZA=1;
if (valdZA<0)
{
signZA=-1;
}
double verA=PI/180*(valdZA*signZA+valmZA/60+valsZA/3600)*signZA;
RadZA.Format("%.10f",verA);
int signZB=1;
if (valdZB<0)
{
signZB=-1;
}
double verB=PI/180*(valdZB*signZB+valmZB/60+valsZB/3600)*signZB;
RadZB.Format("%.10f",verB);
}
void CDeforoberDlg::OnCommMscomm2()
{
// TODO: 在此处添加消息处理程序代码
}
void CDeforoberDlg::MesureA()
{
CString str="\n%R1Q,9007:0.000157079, 0.000157079\r\n";// 设置移动仪器后容许搜索范围(最大32.4秒)
m_comcl.SetOutput(COleVariant(str));
str=("\n%R1Q,9027:")+RadPA+","+RadZA+("0,0,0\r\n");//*移动仪器至A
m_comcl.SetOutput(COleVariant(str));
str="\n%R1Q,9018:1\r\n"; //打开ATR(自动识别目标模式)
m_comcl.SetOutput(COleVariant(str));
str="\n%R1Q,1004:1\r\n"; //打开激光
m_comcl.SetOutput(COleVariant(str));
str="\n%R1Q,9029:0.02,0.02,0\r\n"; //设置目标搜索区域(50m,方圆1m)
m_comcl.SetOutput(COleVariant(str));
str="\n%R1Q,2008:6,1\r\n"; //第一参数为开测,第二为自动倾斜改正
m_comcl.SetOutput(COleVariant(str));
m_comcl.SetInput(COleVariant("")); //清空接受缓存区的内容,以便接受坐标值
str="\n%R1Q,2082:2000,1"; //测坐标,第一参数延时2秒等测距数据,第二自动倾斜改正
m_comcl.SetOutput(COleVariant(str));
VARIANT varRet=m_comcl.GetInput();
varRet.vt=VT_BSTR;
CString strRet=varRet.pcVal;
int i=0;
while (strRet[i]!=comma)
{
i++;
}
i++;
while(strRet[i]!=comma)
{
i++;
}
i++;
while(strRet[i]!=comma)
{
i++;
}
i++;
while (strRet[i]!=comma)
{
strEA+=strRet[i];
i++;
}
i++;
while (strRet[i]!=comma)
{
strNA+=strRet[i];
i++;
}
i++;
while (strRet[i]!=comma)
{
strHA+=strRet[i];
i++;
}
str="\n%R1Q,1004:0\r\n"; //关闭激光
m_comcl.SetOutput(COleVariant(str));
}
void CDeforoberDlg::MesureB()
{
CString str;
str=("\n%R1Q,9027:")+RadPB+","+RadZB+("0,0,0\r\n");//*移动仪器至B
m_comcl.SetOutput(COleVariant(str));
// str="\n%R1Q,9018:1\r\n"; //打开ATR(自动识别目标模式)
// m_comcl.SetOutput(COleVariant(str));
str="\n%R1Q,1004:1\r\n"; //打开激光
m_comcl.SetOutput(COleVariant(str));
// str="\n%R1Q,9029:0.02,0.02,0\r\n"; //设置目标搜索区域(50m,方圆1m)
// m_comcl.SetOutput(COleVariant(str));
str="\n%R1Q,2008:6,1\r\n"; //第一参数为开测,第二为自动倾斜改正
m_comcl.SetOutput(COleVariant(str));
m_comcl.SetInput(COleVariant("")); //清空接受缓存区的内容,以便接受坐标值
str="\n%R1Q,2082:2000,1"; //测坐标,第一参数延时2秒等测距数据,第二自动倾斜改正
m_comcl.SetOutput(COleVariant(str));
VARIANT varRet=m_comcl.GetInput();
varRet.vt=VT_BSTR;
CString strRet=varRet.pcVal;
int i=0;
while (strRet[i]!=comma)
{
i++;
}
i++;
while(strRet[i]!=comma)
{
i++;
}
i++;
while(strRet[i]!=comma)
{
i++;
}
i++;
while (strRet[i]!=comma)
{
strEB+=strRet[i];
i++;
}
i++;
while (strRet[i]!=comma)
{
strNB+=strRet[i];
i++;
}
i++;
while (strRet[i]!=comma)
{
strHB+=strRet[i];
i++;
}
str="\n%R1Q,1004:0\r\n"; //关闭激光
m_comcl.SetOutput(COleVariant(str));
}
void CDeforoberDlg::TimeDriven()
{
// 获取用户设定的时间
CTime timeSet;
m_conTime.GetTime(timeSet);
hourSet=timeSet.GetHour();
minSet=timeSet.GetMinute();
secSet=timeSet.GetSecond();
}
void CDeforoberDlg::OnBnClickedButton1()
{
OutPut();// TODO: 在此添加控件通知处理程序代码
}
void CDeforoberDlg::OnBnClickedButtonTimeOber()
{
TimeDriven(); //执行以获取用户设定时间
SetTimer(1,1000,0);// TODO: 在此添加控件通知处理程序代码
OnTimer(1);
}
void CDeforoberDlg::OnTimer(UINT_PTR nIDEvent)
{
// 获取系统时间
timeCurr=CTime::GetCurrentTime();
hourCurr=timeCurr.GetHour();
minCurr=timeCurr.GetMinute();
secCurr=timeCurr.GetSecond();// TODO: 在此添加消息处理程序代码和/或调用默认值
if (hourCurr+minCurr+secCurr==hourSet+minSet+secSet) //当系统时间等于用户时间,开测
{
OnBnClickedButtonObserve();
}
CDialog::OnTimer(nIDEvent);
}
// 待修正!
void CDeforoberDlg::OutPut()
{
CTime currentTime;
currentTime=CTime::GetCurrentTime();
//currentTime.GetCurrentTime();
//ctime转成字符cstring,%c为MSDN所查
strShow+=currentTime.Format("%c \r\n");
strShow+="A点:\r\nN:"+strEA+"\tE:"+strNA+"\tH:"+strHA+"\r\n";
strShow+="B点:\r\nN:"+strEB+"\tE:"+strNB+"\tH:"+strHB+"\r\n\r\n";
CFile file(lpszPathName,CFile::modeCreate|CFile::modeWrite);
file.Write(strShow,strShow.GetLength());
file.Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -