/************************************************************************************************** 版本所有(C), 2020-2022, 北京普达迪泰 *************************************************************************************************** 文 件 名: DynamicTask.cpp 功能描述: 动态测量任务 版 本 号: 1.00初版 作 者: HYF 生成日期; 2021-12-20 最近修改: 函数列表: 修改历史: 1.日 期 :2021-12-20 作 者 : HYF 修改内容 : 创建文件 **************************************************************************************************/ #include "pch.h" #include "Dms.h" #include "DynamicTask.h" #include "DmsDoc.h" #include "CppSQLite3.h" #include "EquipTypePlaceManager.h" #include "TaskManager.h" #include "EquipDataManager.h" #include "PostureDataPointManager.h" #include "PostureDataAngleManager.h" #include "DynamicReport.h" #include "CompareDlg.h" #include "IDPMSManager.h" #include "OSGView.h" #include "MainFrm.h" #include "EquipTypePlaceDlg.h" #include "EquipTypePlace.h" #include "DynamicData.h" #include "DynamicTaskThread.h" #include "PostureDataAngle.h" #include "DbCamConfigDlg.h" // 秒定时器:用于显示当前时间 #define MEASURE_TIMER 1000 // CDynamicTask IMPLEMENT_DYNCREATE(CDynamicTask, CFormView) CDynamicTask::CDynamicTask() : CFormView(IDD_VIEW_DYNAMIC_TASK) , m_szTimeCost(_T("")) , m_pOSGView(NULL) , m_bExecuted(FALSE) { m_BkBrush.CreateSolidBrush(RGB(247, 247, 247)); } CDynamicTask::~CDynamicTask() { } void CDynamicTask::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATIC_TASK_TITLE, m_Static_Title); DDX_Control(pDX, IDC_STATIC_EQUIP_TYPE_CODE, m_Static_EquipTypeCode); DDX_Control(pDX, IDC_STATIC_EQUIP_CODE, m_Static_EquipCode); DDX_Control(pDX, IDC_STATIC_MEASURE_TIME, m_Static_MeasureTime); DDX_Control(pDX, IDC_STATIC_RESULT_1_X, m_Static_Angle_AX); DDX_Control(pDX, IDC_STATIC_RESULT_1_Y, m_Static_Angle_AY); DDX_Control(pDX, IDC_STATIC_RESULT_1_Z, m_Static_Angle_AZ); DDX_Control(pDX, IDC_STATIC_RESULT_1, m_Static_Angle_A_Label); DDX_Control(pDX, IDC_STATIC_RESULT_2, m_Static_Angle_E_Label); DDX_Control(pDX, IDC_STATIC_RESULT_2_X, m_Static_Angle_EX); DDX_Control(pDX, IDC_STATIC_RESULT_2_Y, m_Static_Angle_EY); DDX_Control(pDX, IDC_STATIC_RESULT_2_Z, m_Static_Angle_EZ); DDX_Control(pDX, IDC_STATIC_RESULT_3, m_Static_Thrust_Label); DDX_Control(pDX, IDC_STATIC_RESULT_3_S, m_Static_Line_Start); DDX_Control(pDX, IDC_STATIC_RESULT_3_E, m_Static_Line_End); DDX_Control(pDX, IDC_BTN_STARTTASK, m_Btn_Start); DDX_Control(pDX, IDC_BTN_OUTPUT_REPORT, m_Btn_Report); DDX_Control(pDX, IDC_BTN_COMPARE_RESULT, m_Btn_Compare); DDX_Control(pDX, IDC_CMB_PLACE, m_Combo_EquipPlace); DDX_Control(pDX, IDC_STATIC_ADD_PLACE, m_Static_AddPlace); DDX_Control(pDX, IDC_BTN_STOP, m_BtnStop); DDX_Text(pDX, IDC_STATIC_MEASURE_TIME, m_szTimeCost); DDX_Text(pDX, IDC_STATIC_RESULT_1_X, m_szAngleAX); DDX_Text(pDX, IDC_STATIC_RESULT_1_Y, m_szAngleAY); DDX_Text(pDX, IDC_STATIC_RESULT_1_Z, m_szAngleAZ); DDX_Text(pDX, IDC_STATIC_RESULT_2_X, m_szAngleEX); DDX_Text(pDX, IDC_STATIC_RESULT_2_Y, m_szAngleEY); DDX_Text(pDX, IDC_STATIC_RESULT_2_Z, m_szAngleEZ); DDX_Text(pDX, IDC_STATIC_RESULT_3_S, m_szLineStart); DDX_Text(pDX, IDC_STATIC_RESULT_3_E, m_szLineEnd); DDX_Control(pDX, IDC_STATIC_TIMESPAN, m_Static_Label_TimeSpan); DDX_Control(pDX, IDC_STATIC_SECOND, m_Static_Label_Second); DDX_Control(pDX, IDC_COMBO_TIMESPAN, m_Combox_Frequency); DDX_Control(pDX, IDC_BTN_COMPLETE, m_Btn_Finish); } BEGIN_MESSAGE_MAP(CDynamicTask, CFormView) ON_WM_CREATE() ON_WM_CTLCOLOR() ON_WM_TIMER() ON_BN_CLICKED(IDC_BTN_STARTTASK, &CDynamicTask::OnBnClickedBtnStartTask) ON_BN_CLICKED(IDC_BTN_COMPARE_RESULT, &CDynamicTask::OnBnClickedBtnCompareResult) ON_BN_CLICKED(IDC_BTN_OUTPUT_REPORT, &CDynamicTask::OnBnClickedBtnOutputReport) ON_WM_SIZE() ON_WM_DESTROY() ON_BN_CLICKED(IDC_BTN_BACK, &CDynamicTask::OnBnClickedBtnBack) ON_STN_CLICKED(IDC_STATIC_ADD_PLACE, &CDynamicTask::OnStnClickedStaticAddPlace) ON_MESSAGE(WM_SUCCESS, OnMeasureSuccess) ON_MESSAGE(WM_FAILURE, OnMeasureFailure) ON_MESSAGE(WM_COMPLETE , OnMeasureComplete ) ON_MESSAGE(WM_START_IDPMS, OnReStartIDPMS) ON_BN_CLICKED(IDC_BTN_STOP, &CDynamicTask::OnBnClickedBtnPause) ON_CBN_SELCHANGE(IDC_COMBO_TIMESPAN, &CDynamicTask::OnCbnSelchangeComboTimespan) ON_BN_CLICKED(IDC_BTN_CAM_CONFIG, &CDynamicTask::OnBnClickedBtnCamConfig) ON_CBN_SELCHANGE(IDC_CMB_PLACE, &CDynamicTask::OnCbnSelchangeEquipPlace) ON_BN_CLICKED(IDC_BTN_COMPLETE, &CDynamicTask::OnBnClickedBtnFinish) END_MESSAGE_MAP() // CDynamicTask 诊断 #ifdef _DEBUG void CDynamicTask::AssertValid() const { CFormView::AssertValid(); } #ifndef _WIN32_WCE void CDynamicTask::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif #endif //_DEBUG /************************************************************************************************** 函 数 名 :OnCreate 功能描述 :消息处理-WM_CREATE 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ int CDynamicTask::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFormView::OnCreate(lpCreateStruct) == -1) return -1; m_pDoc = (CDmsDoc *)GetDocument(); ASSERT(m_pDoc != NULL); ASSERT(m_pDoc->IsKindOf(RUNTIME_CLASS(CDmsDoc))); return 0; } /************************************************************************************************** 函 数 名 :OnUpdate 功能描述 :消息处理-Doc数据变化时回调 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/) { } /************************************************************************************************** 函 数 名 :OnInitialUpdate 功能描述 :初始化UI数据 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CDynamicTask::OnInitialUpdate() { CFormView::OnInitialUpdate(); // 任务标题 m_Static_Title.SetFontSize(16); m_Static_Title.SetFontBold(TRUE); // 型号 m_Static_EquipTypeCode.SetFontSize(15); m_Static_EquipTypeCode.SetFontBold(TRUE); m_Static_EquipTypeCode.SetTextColor(g_crInfoText); // 编号 m_Static_EquipCode.SetFontSize(15); m_Static_EquipCode.SetTextColor(g_crInfoText); m_Static_EquipCode.SetFontBold(TRUE); // 新增部位 m_Static_AddPlace.SetFontSize(13); m_Static_AddPlace.SetLink(TRUE); m_Static_AddPlace.SetTextColor(RGB(42, 130, 228)); m_Static_AddPlace.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_HAND_CURSOR)); // 测量时间 m_Static_MeasureTime.SetFontSize(28); m_Static_MeasureTime.SetFontBold(TRUE); // 测量频率 CString szTimeSpan; szTimeSpan.Format("1"); m_Combox_Frequency.InsertString(0, szTimeSpan); m_Combox_Frequency.SetItemData(0, 1); szTimeSpan.Format("2"); m_Combox_Frequency.InsertString(1, szTimeSpan); m_Combox_Frequency.SetItemData(1, 2); szTimeSpan.Format("3"); m_Combox_Frequency.InsertString(2, szTimeSpan); m_Combox_Frequency.SetItemData(2, 3); szTimeSpan.Format("4"); m_Combox_Frequency.InsertString(3, szTimeSpan); m_Combox_Frequency.SetItemData(3, 4); szTimeSpan.Format("5"); m_Combox_Frequency.InsertString(4, szTimeSpan); m_Combox_Frequency.SetItemData(4, 5); m_Combox_Frequency.SetCurSel(1); // 偏移量 m_Static_Angle_AX.SetFontSize(20); m_Static_Angle_AX.SetFontBold(TRUE); m_Static_Angle_AX.SetTextColor(g_crInfoText); m_Static_Angle_AY.SetFontSize(20); m_Static_Angle_AY.SetFontBold(TRUE); m_Static_Angle_AY.SetTextColor(g_crInfoText); m_Static_Angle_AZ.SetFontSize(20); m_Static_Angle_AZ.SetFontBold(TRUE); m_Static_Angle_AZ.SetTextColor(g_crInfoText); // 调校量 m_Static_Angle_EX.SetFontSize(20); m_Static_Angle_EX.SetFontBold(TRUE); m_Static_Angle_EX.SetTextColor(g_crInfoText); m_Static_Angle_EY.SetFontSize(20); m_Static_Angle_EY.SetFontBold(TRUE); m_Static_Angle_EY.SetTextColor(g_crInfoText); m_Static_Angle_EZ.SetFontSize(20); m_Static_Angle_EZ.SetFontBold(TRUE); m_Static_Angle_EZ.SetTextColor(g_crInfoText); // OSG三维展示初始化 CWnd *pWnd = this->GetDlgItem(IDC_STATIC_OSG); CRect rect1; pWnd->GetWindowRect(&rect1); pWnd->ShowWindow(SW_HIDE); this->ScreenToClient(&rect1); m_pOSGView = (OSGView *)RUNTIME_CLASS(OSGView)->CreateObject(); m_pOSGView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rect1, this, IDC_STATIC_OSG2); m_pOSGView->OnInitialUpdate(); m_pOSGView->ShowWindow(SW_SHOW); } HBRUSH CDynamicTask::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor); return m_BkBrush; } /************************************************************************************************** 函 数 名 :IsModelExist 功能描述 :模型文件是否完整 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL CDynamicTask::IsModelExist(LPCTSTR szEquipTypeCode, CStringArray& arrModel) { CString szPath = Utils::GetLocalUrlDir(); szPath.Append("/Model/"); szPath.Append(szEquipTypeCode); szPath.Append("/"); BOOL bModelExist = true; for (int i = 0; i < arrModel.GetCount(); i++) { CString szModel = arrModel.GetAt(i); CString szModelPath(szPath); szModelPath.Append(szModel); szModelPath.Append(".OSGB"); bModelExist = Utils::IsFileExist(szModelPath); if (!bModelExist) { return FALSE; } LOG::D(szModelPath); } return TRUE; } /************************************************************************************************** 函 数 名 :InitFormData 功能描述 :初始化UI数据 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CDynamicTask::InitFormData(DWORD taskId) { m_taskId = taskId; // 初始化任务展示信息 this->ResetFormData(); this->ShowTaskFieldStatus(); this->InitTaskInfo(); } /************************************************************************************************** 函 数 名 :InitTaskInfo 功能描述 :初始化任务信息 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::InitTaskInfo() { // 初始化数据 TaskManager *pTaskManager = m_pDoc->GetTaskManager(); ASSERT(pTaskManager != NULL); CppSQLite3Query q = pTaskManager->Query(m_taskId); if (!q.eof()) { CString szTaskTitle = q.getStringField("task_title"); m_Static_Title.SetWindowText(szTaskTitle); m_szEquipTypeCode = q.getStringField("equip_type_code"); m_Static_EquipTypeCode.SetWindowText(m_szEquipTypeCode); m_szEquipCode = q.getStringField("equip_code"); m_Static_EquipCode.SetWindowText(m_szEquipCode); // 初始化型号部位列表 this->InitEquipPlaceList(); } q.finalize(); } /************************************************************************************************** 函 数 名 :resetFormData 功能描述 :重置UI数据 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CDynamicTask::ResetFormData() { m_szTimeCost = _T(""); m_iTaskStatus = 0; m_iEclapsed = 0; ShowTaskFieldStatus(); // 从IDPMS获取数据 IDPMSManager *pManager = IDPMSManager::GetManager(); BOOL bRet = pManager->CloseIDPMSProject(); if (!bRet) { LOG::D(_T("IDPMS 通讯异常")); } } /************************************************************************************************** 函 数 名 :ShowTaskFieldStatus 功能描述 :初始化任务信息 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::ShowTaskFieldStatus() { if (m_iTaskStatus == TASK_STATUS_0) { m_Btn_Start.ShowWindow(SW_SHOW); m_Btn_Finish.ShowWindow(SW_HIDE); m_BtnStop.ShowWindow(SW_HIDE); m_BtnStop.SetWindowText(_T("暂停")); m_Static_Label_TimeSpan.ShowWindow(SW_HIDE); m_Combox_Frequency.ShowWindow(SW_HIDE); m_Static_Label_Second.ShowWindow(SW_HIDE); } else if (m_iTaskStatus == TASK_STATUS_RUNNING) { m_Btn_Start.ShowWindow(SW_HIDE); m_Btn_Finish.ShowWindow(SW_SHOW); m_BtnStop.ShowWindow(SW_SHOW); m_Static_Label_TimeSpan.ShowWindow(SW_SHOW); m_Combox_Frequency.ShowWindow(SW_SHOW); m_Static_Label_Second.ShowWindow(SW_SHOW); } else if (m_iTaskStatus == TASK_STATUS_PAUSED) { m_Btn_Start.ShowWindow(SW_HIDE); m_Btn_Report.ShowWindow(SW_SHOW); m_BtnStop.ShowWindow(SW_SHOW); m_Static_Label_TimeSpan.ShowWindow(SW_SHOW); m_Combox_Frequency.ShowWindow(SW_SHOW); m_Static_Label_Second.ShowWindow(SW_SHOW); } if (m_iTaskStatus == TASK_STATUS_0) { m_Static_MeasureTime.ShowWindow(SW_HIDE); m_Static_Angle_A_Label.ShowWindow(SW_HIDE); m_Static_Angle_AX.ShowWindow(SW_HIDE); m_Static_Angle_AY.ShowWindow(SW_HIDE); m_Static_Angle_AZ.ShowWindow(SW_HIDE); m_Static_Angle_E_Label.ShowWindow(SW_HIDE); m_Static_Angle_EX.ShowWindow(SW_HIDE); m_Static_Angle_EY.ShowWindow(SW_HIDE); m_Static_Angle_EZ.ShowWindow(SW_HIDE); m_Static_Thrust_Label.ShowWindow(SW_HIDE); m_Static_Line_Start.ShowWindow(SW_HIDE); m_Static_Line_End.ShowWindow(SW_HIDE); } else { m_Static_MeasureTime.ShowWindow(SW_SHOW); m_Static_Angle_A_Label.ShowWindow(SW_SHOW); m_Static_Angle_AX.ShowWindow(SW_SHOW); m_Static_Angle_AY.ShowWindow(SW_SHOW); m_Static_Angle_AZ.ShowWindow(SW_SHOW); m_Static_Angle_E_Label.ShowWindow(SW_SHOW); m_Static_Angle_EX.ShowWindow(SW_SHOW); m_Static_Angle_EY.ShowWindow(SW_SHOW); m_Static_Angle_EZ.ShowWindow(SW_SHOW); m_Static_Thrust_Label.ShowWindow(SW_SHOW); m_Static_Line_Start.ShowWindow(SW_SHOW); m_Static_Line_End.ShowWindow(SW_SHOW); } if (!m_bExecuted) { m_Btn_Compare.ShowWindow(SW_HIDE); m_Btn_Report.ShowWindow(SW_HIDE); } else { m_Btn_Compare.ShowWindow(SW_SHOW); m_Btn_Report.ShowWindow(SW_SHOW); } } /************************************************************************************************** 函 数 名 :InitEquipPlaceList 功能描述 :初始化任务信息 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::InitEquipPlaceList() { m_Combo_EquipPlace.ResetContent(); // 模型文件 CStringArray arrModel; arrModel.Add(m_szEquipTypeCode); // 初始化数据 EquipTypePlaceManager *pPlaceManager = m_pDoc->GetEquipTypePlaceManager(); ASSERT(pPlaceManager != NULL); int i = 0; CppSQLite3Query q = pPlaceManager->Query(m_szEquipTypeCode); while (!q.eof()) { CString szEquipPlace = q.getStringField("equip_type_place"); m_Combo_EquipPlace.AddString(szEquipPlace); arrModel.Add(szEquipPlace); q.nextRow(); } q.finalize(); // 默认选中第1个 m_idxEquipPlace = 0; CString szEquipPlaceSel; if (m_Combo_EquipPlace.GetCount() > 0) { m_Combo_EquipPlace.SetCurSel(m_idxEquipPlace); m_Combo_EquipPlace.GetLBText(0, szEquipPlaceSel); } // 初始化型号三维展示 BOOL bModelExist = IsModelExist(m_szEquipTypeCode, arrModel); if (!bModelExist) { m_Btn_Start.EnableWindow(FALSE); MessageBox(_T("模型文件不完整,请联系管理员!")); return; } m_Btn_Start.EnableWindow(TRUE); m_pOSGView->LoadOSG(m_szEquipTypeCode, arrModel); if (!szEquipPlaceSel.IsEmpty()) { m_pOSGView->SetCurEquipPlace(szEquipPlaceSel); } } double g_fx = 0.0f; double g_fy = 0.0f; double g_fz = 0.0f; /************************************************************************************************** 函 数 名 :OnTimer 功能描述 :定时器消息 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnTimer(UINT_PTR nIDEvent) { // 测量时间按秒类加 m_iEclapsed++; switch (nIDEvent) { case MEASURE_TIMER: if (m_iEclapsed < 60) { m_szTimeCost.Format("%d秒", m_iEclapsed); } else if (m_iEclapsed < 3600) { m_szTimeCost.Format("%d分%d秒", m_iEclapsed/60, m_iEclapsed%60); } else { m_szTimeCost.Format("%d时%d分%d秒", m_iEclapsed/3600 , m_iEclapsed / 60, m_iEclapsed % 60); } UpdateData(FALSE); break; } CFormView::OnTimer(nIDEvent); } /************************************************************************************************** 函 数 名 :OnBnClickedBtnStarttask 功能描述 :事件处理-开始测量 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnBnClickedBtnStartTask() { CString szResult; // 1. 未运行 -> 运行 if (m_iTaskStatus == TASK_STATUS_0) { int idx = m_Combo_EquipPlace.GetCurSel(); CString szEquipPlace; m_Combo_EquipPlace.GetLBText(idx, szEquipPlace); if (szEquipPlace.IsEmpty()) return; m_pOSGView->SetCurEquipPlace(szEquipPlace); m_bStopClicked = FALSE; // 调用IDPMS启动动态测量处理线程 IDPMSManager *pManager = IDPMSManager::GetManager(); pManager->StartDynamicProcThread(this, m_taskId, m_szEquipTypeCode, m_szEquipCode, szEquipPlace); } } /************************************************************************************************** 函 数 名 :OnMeasureSuccess 功能描述 :事件处理-测量成功WM-SUCCESS自定义消息处理 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ LRESULT CDynamicTask::OnMeasureSuccess(WPARAM wp, LPARAM lp) { if (m_iTaskStatus == TASK_STATUS_0) { m_iTaskStatus = TASK_STATUS_RUNNING; // 开始计算测量时间 m_iEclapsed = 0; // 启动定时器 SetTimer(MEASURE_TIMER, 1000, NULL); this->ShowTaskFieldStatus(); m_bExecuted = TRUE; } // 接收消息包如果不为空,则释放资源 DMSResponse *pMsg = (DMSResponse *)wp; if (pMsg != NULL) { Utils::DMS_FreeMsg(pMsg); } int idx = m_Combo_EquipPlace.GetCurSel(); CString szEquipPlace; m_Combo_EquipPlace.GetLBText(idx, szEquipPlace); // 显示测量结果数据 ShowDynamicTaskData(szEquipPlace); return 0; } /************************************************************************************************** 函 数 名 :OnMeasureFailure 功能描述 :测量失败WM-FAILURE自定义消息处理 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ LRESULT CDynamicTask::OnMeasureFailure(WPARAM wp, LPARAM lp) { if (m_iTaskStatus != TASK_STATUS_0) { m_iTaskStatus = TASK_STATUS_0; // 结束定时器 if (m_iTaskStatus == TASK_STATUS_RUNNING) { KillTimer(MEASURE_TIMER); } this->ShowTaskFieldStatus(); } // 接收消息包如果不为空,则释放资源 DMSResponse *pMsg = (DMSResponse *)wp; if (pMsg != NULL) { CString szMsg(pMsg->szMsg); if (!szMsg.IsEmpty()) MessageBox(szMsg); Utils::DMS_FreeMsg(pMsg); } return 0; } /************************************************************************************************** 函 数 名 :OnMeasureComplete 功能描述 :事件处理-WM-COMPLETE自定义消息处理 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ LRESULT CDynamicTask::OnMeasureComplete(WPARAM wp, LPARAM lp) { // 保存数据到本地 IDPMSManager *pManager = IDPMSManager::GetManager(); DynamicData *pData = pManager->m_pDynamicData; pData->SaveToDB(); // 更新任务为完成状态 TaskManager *pTaskManager = m_pDoc->GetTaskManager(); ASSERT(pTaskManager != NULL); pTaskManager->UpdateStatus(m_taskId, 1); // 1表示完成状态; // 任务重置为初始状态 m_iTaskStatus = TASK_STATUS_0; // 重置视图功能 this->ShowTaskFieldStatus(); return 0; } /************************************************************************************************** 函 数 名 :OnBnClickedBtnFinish 功能描述 :事件处理-停止测量 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnBnClickedBtnFinish() { if (m_iTaskStatus != TASK_STATUS_0) { m_bStopClicked = TRUE; // 调用IDPMS启动动态测量处理线程 IDPMSManager *pManager = IDPMSManager::GetManager(); pManager->StopDynamicTask(); // 结束定时器 if (m_iTaskStatus == TASK_STATUS_RUNNING) { KillTimer(MEASURE_TIMER); } } } /************************************************************************************************** 函 数 名 :OnBnClickedBtnPause 功能描述 :事件处理-暂停测量 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnBnClickedBtnPause() { // 停止动态测量线程任务 IDPMSManager *pManager = IDPMSManager::GetManager(); if (m_iTaskStatus == TASK_STATUS_RUNNING) { pManager->PauseDynamicTask(); m_pOSGView->RotateCurModel(0, 0, 0); m_BtnStop.SetWindowText(_T("继续执行")); m_iTaskStatus = TASK_STATUS_PAUSED; KillTimer(MEASURE_TIMER); } else if (m_iTaskStatus == TASK_STATUS_PAUSED) { pManager->ResumeDynamicTask(); m_BtnStop.SetWindowText(_T("暂停")); m_iTaskStatus = TASK_STATUS_RUNNING; // 启动定时器 SetTimer(MEASURE_TIMER, 1000, NULL); } // 更新UI状态 this->ShowTaskFieldStatus(); } /************************************************************************************************** 函 数 名 :OnBnClickedBtnBack 功能描述 :事件处理-结束返回 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnBnClickedBtnBack() { // 隐视图 this->ShowWindow(SW_HIDE); // 中止测量任务 IDPMSManager *pManager = IDPMSManager::GetManager(); pManager->StopDynamicTask(); // 中止计时器 if (m_iTaskStatus == TASK_STATUS_RUNNING) { KillTimer(MEASURE_TIMER); } // 重置任务状态 m_iTaskStatus = TASK_STATUS_0; // 停止OSG渲染 m_pOSGView->Terminate(); // 重置UI栏位状态 this->ResetFormData(); // 切换视图 CMainFrame *pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd; ::PostMessage(pMain->m_hWnd, WM_BACK_TO_START, NULL, NULL); } /************************************************************************************************** 函 数 名 :FetchDynamicTaskData 功能描述 :请求动态任务数据 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL CDynamicTask::FetchDynamicTaskData(LPCTSTR szEquipPlace) { // 初始化数据 PostureDataAngleManager *pAngleManager = m_pDoc->GetPostureDataAngleManager(); ASSERT(pAngleManager != NULL); CppSQLite3Query q = pAngleManager->Query(m_taskId, m_szEquipCode, szEquipPlace); if (!q.eof()) { m_szAngleAX = q.getStringField("angle_a_x"); m_szAngleAY = q.getStringField("angle_a_y"); m_szAngleAZ = q.getStringField("angle_a_z"); m_szAngleEX = q.getStringField("angle_e_x"); m_szAngleEY = q.getStringField("angle_e_y"); m_szAngleEZ = q.getStringField("angle_e_z"); DOUBLE lineStartX = q.getFloatField("line_start_x"); DOUBLE lineStartY = q.getFloatField("line_start_y"); DOUBLE lineStartZ = q.getFloatField("line_start_z"); DOUBLE lineEndX = q.getFloatField("line_end_x"); DOUBLE lineEndY = q.getFloatField("line_end_y"); DOUBLE lineEndZ = q.getFloatField("line_end_z"); m_szLineStart.Format("起点:(%.3f, %.3f, %.3f)", lineStartX, lineStartY, lineStartZ); m_szLineEnd.Format("终点:(%.3f, %.3f, %.3f)", lineEndX, lineEndY, lineEndZ); UpdateData(FALSE); q.finalize(); return TRUE; } q.finalize(); return FALSE; } /************************************************************************************************** 函 数 名 :OnBnClickedBtnCompareResult 功能描述 :事件处理-结果比对 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CDynamicTask::OnBnClickedBtnCompareResult() { CompareDlg dlg(this, m_taskId); dlg.DoModal(); } /************************************************************************************************** 函 数 名 :OnBnClickedBtnOutputReport 功能描述 :事件处理-输出报告 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnBnClickedBtnOutputReport() { // 显示报告视图 DynamicReport dlg2(this, m_taskId); dlg2.DoModal(); } /************************************************************************************************** 函 数 名 :OnSize 功能描述 :事件处理-WM-SIZE 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); if (m_pOSGView == NULL) return; CWnd *pWnd = this->GetDlgItem(IDC_STATIC_OSG); if (pWnd == NULL) return; CRect rect1; pWnd->GetWindowRect(&rect1); this->ScreenToClient(&rect1); m_pOSGView->MoveWindow(&rect1); } /************************************************************************************************** 函 数 名 :OnCbnSelchangeEquipPlace 功能描述 :分机选择事件处理 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnCbnSelchangeEquipPlace() { // 获取当前选中索引 int iSel = m_Combo_EquipPlace.GetCurSel(); if (m_idxEquipPlace == iSel) return; // 测量任务正在进行中,不能改变部位 if (m_iTaskStatus != TASK_STATUS_0) { m_Combo_EquipPlace.SetCurSel(m_idxEquipPlace); MessageBox(_T("请先停止测量,再改变设备部位")); return; } } /************************************************************************************************** 函 数 名 :ShowDynamicTaskData 功能描述 :显示动态任务数据 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ BOOL CDynamicTask::ShowDynamicTaskData(LPCTSTR szEquipPlace) { // 调用IDPMS启动动态测量处理线程 IDPMSManager *pManager = IDPMSManager::GetManager(); DynamicData *pData = pManager->m_pDynamicData; PostureDataAngle *pAngle = pData->GetAngle(m_taskId, szEquipPlace); if (pAngle != NULL) { m_szAngleAX.Format("%.3f", pAngle->GetAngleAX()); m_szAngleAY.Format("%.3f", pAngle->GetAngleAY()); m_szAngleAZ.Format("%.3f", pAngle->GetAngleAZ()); // 1.推力线起终点 DOUBLE fX1 = pAngle->GetLineStartX(); DOUBLE fY1 = pAngle->GetLineStartY(); DOUBLE fZ1 = pAngle->GetLineStartZ(); DOUBLE fX2 = pAngle->GetLineEndX(); DOUBLE fY2 = pAngle->GetLineEndY(); DOUBLE fZ2 = pAngle->GetLineEndZ(); // 2.计算偏角数据 DOUBLE v1 = (fX1 - fX2); DOUBLE v2 = (fY1 - fY2); DOUBLE v3 = (fZ1 - fZ2); DOUBLE ax = atan(v2 / v3) * 180 / PI; DOUBLE ay = atan(v1 / v3) * 180 / PI; DOUBLE az = atan(0) * 180 / PI; m_pOSGView->RotateCurModel(ax, ay, az); // Test //double ty = 20 - 1 * m_iEclapsed; //m_pOSGView->RotateCurModel(0, ty, 0); m_szAngleEX.Format("%.3f", pAngle->GetAngleEX()); m_szAngleEY.Format("%.3f", pAngle->GetAngleEY()); m_szAngleEZ.Format("%.3f", pAngle->GetAngleEZ()); DOUBLE lineStartX = pAngle->GetLineStartX(); DOUBLE lineStartY = pAngle->GetLineStartY(); DOUBLE lineStartZ = pAngle->GetLineStartZ(); DOUBLE lineEndX = pAngle->GetLineEndX(); DOUBLE lineEndY = pAngle->GetLineEndY(); DOUBLE lineEndZ = pAngle->GetLineEndZ(); m_szLineStart.Format("起点:(%.3f, %.3f, %.3f)", lineStartX, lineStartY, lineStartZ); m_szLineEnd.Format("终点:(%.3f, %.3f, %.3f)", lineEndX, lineEndY, lineEndZ); UpdateData(FALSE); return TRUE; } return FALSE; } /************************************************************************************************** 函 数 名 :OnCbnSelchangeComboTimespan 功能描述 :事件处理-修改动态测量时间间隔 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnCbnSelchangeComboTimespan() { int idx = m_Combox_Frequency.GetCurSel(); DWORD dwFrequency = (DWORD)m_Combox_Frequency.GetItemData(idx); DWORD dwNow = GetTickCount(); DWORD dwTimeSpan = 1000 / dwFrequency; IDPMSManager *pManager = IDPMSManager::GetManager(); pManager->SetDynamicTaskTimeSpan(dwTimeSpan); } /************************************************************************************************** 函 数 名 :OnBnClickedBtnDoubleCameraConfig 功能描述 :事件处理-双相机标定 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnBnClickedBtnCamConfig() { DbCamConfigDlg dlg(this, m_szEquipTypeCode, m_szEquipCode); if (dlg.DoModal() == IDOK) { } } /************************************************************************************************** 函 数 名 :OnRestartIDPMS 功能描述 :WM_RESTART_IDPMS处理 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ afx_msg LRESULT CDynamicTask::OnReStartIDPMS(WPARAM wp, LPARAM lp) { // 从IDPMS获取数据 IDPMSManager *pManager = IDPMSManager::GetManager(); BOOL bRet = pManager->StartIDPMS2(); if (!bRet) { MessageBox(_T("IDPMS引擎启动失败!")); } return 0; } /************************************************************************************************** 函 数 名 :OnDestroy 功能描述 :事件处理-WM-DESTORY 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnDestroy() { CFormView::OnDestroy(); if (m_pOSGView != NULL) { delete m_pOSGView; m_pOSGView = NULL; } } /************************************************************************************************** 函 数 名 :OnStnClickedStaticAddPlace 功能描述 :事件处理-新增设备部位 输入参数 :略 输出参数 :略 返 回 值 :略 **************************************************************************************************/ void CDynamicTask::OnStnClickedStaticAddPlace() { EquipTypePlaceDlg dlg(this, m_szEquipTypeCode); if (dlg.DoModal() == IDOK) { this->InitEquipPlaceList(); } return; }