⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 deforoberdlg.cpp

📁 工程测量专业软件。对徕卡公司的TPS1100测量机器人进行自动化控制
💻 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 + -