DynamicTask.cpp 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053
  1. /**************************************************************************************************
  2. 版本所有(C), 2020-2022, 北京普达迪泰
  3. ***************************************************************************************************
  4. 文 件 名: DynamicTask.cpp
  5. 功能描述: 动态测量任务
  6. 版 本 号: 1.00初版
  7. 作 者: HYF
  8. 生成日期; 2021-12-20
  9. 最近修改:
  10. 函数列表:
  11. 修改历史:
  12. 1.日 期 :2021-12-20
  13. 作 者 : HYF
  14. 修改内容 : 创建文件
  15. **************************************************************************************************/
  16. #include "pch.h"
  17. #include "Dms.h"
  18. #include "DynamicTask.h"
  19. #include "DmsDoc.h"
  20. #include "CppSQLite3.h"
  21. #include "EquipTypePlaceManager.h"
  22. #include "TaskManager.h"
  23. #include "EquipDataManager.h"
  24. #include "PostureDataPointManager.h"
  25. #include "PostureDataAngleManager.h"
  26. #include "DynamicReport.h"
  27. #include "CompareDlg.h"
  28. #include "IDPMSManager.h"
  29. #include "OSGView.h"
  30. #include "MainFrm.h"
  31. #include "EquipTypePlaceDlg.h"
  32. #include "EquipTypePlace.h"
  33. #include "DynamicData.h"
  34. #include "DynamicTaskThread.h"
  35. #include "PostureDataAngle.h"
  36. #include "DbCamConfigDlg.h"
  37. // 秒定时器:用于显示当前时间
  38. #define MEASURE_TIMER 1000
  39. // CDynamicTask
  40. IMPLEMENT_DYNCREATE(CDynamicTask, CFormView)
  41. CDynamicTask::CDynamicTask()
  42. : CFormView(IDD_VIEW_DYNAMIC_TASK)
  43. , m_szTimeCost(_T(""))
  44. , m_pOSGView(NULL)
  45. , m_bExecuted(FALSE)
  46. {
  47. m_BkBrush.CreateSolidBrush(RGB(247, 247, 247));
  48. }
  49. CDynamicTask::~CDynamicTask()
  50. {
  51. }
  52. void CDynamicTask::DoDataExchange(CDataExchange* pDX)
  53. {
  54. CFormView::DoDataExchange(pDX);
  55. DDX_Control(pDX, IDC_STATIC_TASK_TITLE, m_Static_Title);
  56. DDX_Control(pDX, IDC_STATIC_EQUIP_TYPE_CODE, m_Static_EquipTypeCode);
  57. DDX_Control(pDX, IDC_STATIC_EQUIP_CODE, m_Static_EquipCode);
  58. DDX_Control(pDX, IDC_STATIC_MEASURE_TIME, m_Static_MeasureTime);
  59. DDX_Control(pDX, IDC_STATIC_RESULT_1_X, m_Static_Angle_AX);
  60. DDX_Control(pDX, IDC_STATIC_RESULT_1_Y, m_Static_Angle_AY);
  61. DDX_Control(pDX, IDC_STATIC_RESULT_1_Z, m_Static_Angle_AZ);
  62. DDX_Control(pDX, IDC_STATIC_RESULT_1, m_Static_Angle_A_Label);
  63. DDX_Control(pDX, IDC_STATIC_RESULT_2, m_Static_Angle_E_Label);
  64. DDX_Control(pDX, IDC_STATIC_RESULT_2_X, m_Static_Angle_EX);
  65. DDX_Control(pDX, IDC_STATIC_RESULT_2_Y, m_Static_Angle_EY);
  66. DDX_Control(pDX, IDC_STATIC_RESULT_2_Z, m_Static_Angle_EZ);
  67. DDX_Control(pDX, IDC_STATIC_RESULT_3, m_Static_Thrust_Label);
  68. DDX_Control(pDX, IDC_STATIC_RESULT_3_S, m_Static_Line_Start);
  69. DDX_Control(pDX, IDC_STATIC_RESULT_3_E, m_Static_Line_End);
  70. DDX_Control(pDX, IDC_BTN_STARTTASK, m_Btn_Start);
  71. DDX_Control(pDX, IDC_BTN_OUTPUT_REPORT, m_Btn_Report);
  72. DDX_Control(pDX, IDC_BTN_COMPARE_RESULT, m_Btn_Compare);
  73. DDX_Control(pDX, IDC_CMB_PLACE, m_Combo_EquipPlace);
  74. DDX_Control(pDX, IDC_STATIC_ADD_PLACE, m_Static_AddPlace);
  75. DDX_Control(pDX, IDC_BTN_STOP, m_BtnStop);
  76. DDX_Text(pDX, IDC_STATIC_MEASURE_TIME, m_szTimeCost);
  77. DDX_Text(pDX, IDC_STATIC_RESULT_1_X, m_szAngleAX);
  78. DDX_Text(pDX, IDC_STATIC_RESULT_1_Y, m_szAngleAY);
  79. DDX_Text(pDX, IDC_STATIC_RESULT_1_Z, m_szAngleAZ);
  80. DDX_Text(pDX, IDC_STATIC_RESULT_2_X, m_szAngleEX);
  81. DDX_Text(pDX, IDC_STATIC_RESULT_2_Y, m_szAngleEY);
  82. DDX_Text(pDX, IDC_STATIC_RESULT_2_Z, m_szAngleEZ);
  83. DDX_Text(pDX, IDC_STATIC_RESULT_3_S, m_szLineStart);
  84. DDX_Text(pDX, IDC_STATIC_RESULT_3_E, m_szLineEnd);
  85. DDX_Control(pDX, IDC_STATIC_TIMESPAN, m_Static_Label_TimeSpan);
  86. DDX_Control(pDX, IDC_STATIC_SECOND, m_Static_Label_Second);
  87. DDX_Control(pDX, IDC_COMBO_TIMESPAN, m_Combox_Frequency);
  88. DDX_Control(pDX, IDC_BTN_COMPLETE, m_Btn_Finish);
  89. }
  90. BEGIN_MESSAGE_MAP(CDynamicTask, CFormView)
  91. ON_WM_CREATE()
  92. ON_WM_CTLCOLOR()
  93. ON_WM_TIMER()
  94. ON_BN_CLICKED(IDC_BTN_STARTTASK, &CDynamicTask::OnBnClickedBtnStartTask)
  95. ON_BN_CLICKED(IDC_BTN_COMPARE_RESULT, &CDynamicTask::OnBnClickedBtnCompareResult)
  96. ON_BN_CLICKED(IDC_BTN_OUTPUT_REPORT, &CDynamicTask::OnBnClickedBtnOutputReport)
  97. ON_WM_SIZE()
  98. ON_WM_DESTROY()
  99. ON_BN_CLICKED(IDC_BTN_BACK, &CDynamicTask::OnBnClickedBtnBack)
  100. ON_STN_CLICKED(IDC_STATIC_ADD_PLACE, &CDynamicTask::OnStnClickedStaticAddPlace)
  101. ON_MESSAGE(WM_SUCCESS, OnMeasureSuccess)
  102. ON_MESSAGE(WM_FAILURE, OnMeasureFailure)
  103. ON_MESSAGE(WM_COMPLETE , OnMeasureComplete )
  104. ON_MESSAGE(WM_START_IDPMS, OnReStartIDPMS)
  105. ON_BN_CLICKED(IDC_BTN_STOP, &CDynamicTask::OnBnClickedBtnPause)
  106. ON_CBN_SELCHANGE(IDC_COMBO_TIMESPAN, &CDynamicTask::OnCbnSelchangeComboTimespan)
  107. ON_BN_CLICKED(IDC_BTN_CAM_CONFIG, &CDynamicTask::OnBnClickedBtnCamConfig)
  108. ON_CBN_SELCHANGE(IDC_CMB_PLACE, &CDynamicTask::OnCbnSelchangeEquipPlace)
  109. ON_BN_CLICKED(IDC_BTN_COMPLETE, &CDynamicTask::OnBnClickedBtnFinish)
  110. END_MESSAGE_MAP()
  111. // CDynamicTask 诊断
  112. #ifdef _DEBUG
  113. void CDynamicTask::AssertValid() const
  114. {
  115. CFormView::AssertValid();
  116. }
  117. #ifndef _WIN32_WCE
  118. void CDynamicTask::Dump(CDumpContext& dc) const
  119. {
  120. CFormView::Dump(dc);
  121. }
  122. #endif
  123. #endif //_DEBUG
  124. /**************************************************************************************************
  125. 函 数 名 :OnCreate
  126. 功能描述 :消息处理-WM_CREATE
  127. 输入参数 :无
  128. 输出参数 :无
  129. 返 回 值 :void
  130. **************************************************************************************************/
  131. int CDynamicTask::OnCreate(LPCREATESTRUCT lpCreateStruct)
  132. {
  133. if (CFormView::OnCreate(lpCreateStruct) == -1)
  134. return -1;
  135. m_pDoc = (CDmsDoc *)GetDocument();
  136. ASSERT(m_pDoc != NULL);
  137. ASSERT(m_pDoc->IsKindOf(RUNTIME_CLASS(CDmsDoc)));
  138. return 0;
  139. }
  140. /**************************************************************************************************
  141. 函 数 名 :OnUpdate
  142. 功能描述 :消息处理-Doc数据变化时回调
  143. 输入参数 :略
  144. 输出参数 :略
  145. 返 回 值 :略
  146. **************************************************************************************************/
  147. void CDynamicTask::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
  148. {
  149. }
  150. /**************************************************************************************************
  151. 函 数 名 :OnInitialUpdate
  152. 功能描述 :初始化UI数据
  153. 输入参数 :无
  154. 输出参数 :无
  155. 返 回 值 :void
  156. **************************************************************************************************/
  157. void CDynamicTask::OnInitialUpdate()
  158. {
  159. CFormView::OnInitialUpdate();
  160. // 任务标题
  161. m_Static_Title.SetFontSize(16);
  162. m_Static_Title.SetFontBold(TRUE);
  163. // 型号
  164. m_Static_EquipTypeCode.SetFontSize(15);
  165. m_Static_EquipTypeCode.SetFontBold(TRUE);
  166. m_Static_EquipTypeCode.SetTextColor(g_crInfoText);
  167. // 编号
  168. m_Static_EquipCode.SetFontSize(15);
  169. m_Static_EquipCode.SetTextColor(g_crInfoText);
  170. m_Static_EquipCode.SetFontBold(TRUE);
  171. // 新增部位
  172. m_Static_AddPlace.SetFontSize(13);
  173. m_Static_AddPlace.SetLink(TRUE);
  174. m_Static_AddPlace.SetTextColor(RGB(42, 130, 228));
  175. m_Static_AddPlace.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_HAND_CURSOR));
  176. // 测量时间
  177. m_Static_MeasureTime.SetFontSize(28);
  178. m_Static_MeasureTime.SetFontBold(TRUE);
  179. // 测量频率
  180. CString szTimeSpan;
  181. szTimeSpan.Format("1");
  182. m_Combox_Frequency.InsertString(0, szTimeSpan);
  183. m_Combox_Frequency.SetItemData(0, 1);
  184. szTimeSpan.Format("2");
  185. m_Combox_Frequency.InsertString(1, szTimeSpan);
  186. m_Combox_Frequency.SetItemData(1, 2);
  187. szTimeSpan.Format("3");
  188. m_Combox_Frequency.InsertString(2, szTimeSpan);
  189. m_Combox_Frequency.SetItemData(2, 3);
  190. szTimeSpan.Format("4");
  191. m_Combox_Frequency.InsertString(3, szTimeSpan);
  192. m_Combox_Frequency.SetItemData(3, 4);
  193. szTimeSpan.Format("5");
  194. m_Combox_Frequency.InsertString(4, szTimeSpan);
  195. m_Combox_Frequency.SetItemData(4, 5);
  196. m_Combox_Frequency.SetCurSel(1);
  197. // 偏移量
  198. m_Static_Angle_AX.SetFontSize(20);
  199. m_Static_Angle_AX.SetFontBold(TRUE);
  200. m_Static_Angle_AX.SetTextColor(g_crInfoText);
  201. m_Static_Angle_AY.SetFontSize(20);
  202. m_Static_Angle_AY.SetFontBold(TRUE);
  203. m_Static_Angle_AY.SetTextColor(g_crInfoText);
  204. m_Static_Angle_AZ.SetFontSize(20);
  205. m_Static_Angle_AZ.SetFontBold(TRUE);
  206. m_Static_Angle_AZ.SetTextColor(g_crInfoText);
  207. // 调校量
  208. m_Static_Angle_EX.SetFontSize(20);
  209. m_Static_Angle_EX.SetFontBold(TRUE);
  210. m_Static_Angle_EX.SetTextColor(g_crInfoText);
  211. m_Static_Angle_EY.SetFontSize(20);
  212. m_Static_Angle_EY.SetFontBold(TRUE);
  213. m_Static_Angle_EY.SetTextColor(g_crInfoText);
  214. m_Static_Angle_EZ.SetFontSize(20);
  215. m_Static_Angle_EZ.SetFontBold(TRUE);
  216. m_Static_Angle_EZ.SetTextColor(g_crInfoText);
  217. // OSG三维展示初始化
  218. CWnd *pWnd = this->GetDlgItem(IDC_STATIC_OSG);
  219. CRect rect1;
  220. pWnd->GetWindowRect(&rect1);
  221. pWnd->ShowWindow(SW_HIDE);
  222. this->ScreenToClient(&rect1);
  223. m_pOSGView = (OSGView *)RUNTIME_CLASS(OSGView)->CreateObject();
  224. m_pOSGView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rect1, this, IDC_STATIC_OSG2);
  225. m_pOSGView->OnInitialUpdate();
  226. m_pOSGView->ShowWindow(SW_SHOW);
  227. }
  228. HBRUSH CDynamicTask::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  229. {
  230. HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
  231. return m_BkBrush;
  232. }
  233. /**************************************************************************************************
  234. 函 数 名 :IsModelExist
  235. 功能描述 :模型文件是否完整
  236. 输入参数 :略
  237. 输出参数 :略
  238. 返 回 值 :略
  239. **************************************************************************************************/
  240. BOOL CDynamicTask::IsModelExist(LPCTSTR szEquipTypeCode, CStringArray& arrModel)
  241. {
  242. CString szPath = Utils::GetLocalUrlDir();
  243. szPath.Append("/Model/");
  244. szPath.Append(szEquipTypeCode);
  245. szPath.Append("/");
  246. BOOL bModelExist = true;
  247. for (int i = 0; i < arrModel.GetCount(); i++)
  248. {
  249. CString szModel = arrModel.GetAt(i);
  250. CString szModelPath(szPath);
  251. szModelPath.Append(szModel);
  252. szModelPath.Append(".OSGB");
  253. bModelExist = Utils::IsFileExist(szModelPath);
  254. if (!bModelExist) {
  255. return FALSE;
  256. }
  257. LOG::D(szModelPath);
  258. }
  259. return TRUE;
  260. }
  261. /**************************************************************************************************
  262. 函 数 名 :InitFormData
  263. 功能描述 :初始化UI数据
  264. 输入参数 :无
  265. 输出参数 :无
  266. 返 回 值 :void
  267. **************************************************************************************************/
  268. void CDynamicTask::InitFormData(DWORD taskId)
  269. {
  270. m_taskId = taskId;
  271. // 初始化任务展示信息
  272. this->ResetFormData();
  273. this->ShowTaskFieldStatus();
  274. this->InitTaskInfo();
  275. }
  276. /**************************************************************************************************
  277. 函 数 名 :InitTaskInfo
  278. 功能描述 :初始化任务信息
  279. 输入参数 :略
  280. 输出参数 :略
  281. 返 回 值 :略
  282. **************************************************************************************************/
  283. void CDynamicTask::InitTaskInfo()
  284. {
  285. // 初始化数据
  286. TaskManager *pTaskManager = m_pDoc->GetTaskManager();
  287. ASSERT(pTaskManager != NULL);
  288. CppSQLite3Query q = pTaskManager->Query(m_taskId);
  289. if (!q.eof()) {
  290. CString szTaskTitle = q.getStringField("task_title");
  291. m_Static_Title.SetWindowText(szTaskTitle);
  292. m_szEquipTypeCode = q.getStringField("equip_type_code");
  293. m_Static_EquipTypeCode.SetWindowText(m_szEquipTypeCode);
  294. m_szEquipCode = q.getStringField("equip_code");
  295. m_Static_EquipCode.SetWindowText(m_szEquipCode);
  296. // 初始化型号部位列表
  297. this->InitEquipPlaceList();
  298. }
  299. q.finalize();
  300. }
  301. /**************************************************************************************************
  302. 函 数 名 :resetFormData
  303. 功能描述 :重置UI数据
  304. 输入参数 :无
  305. 输出参数 :无
  306. 返 回 值 :void
  307. **************************************************************************************************/
  308. void CDynamicTask::ResetFormData()
  309. {
  310. m_szTimeCost = _T("");
  311. m_iTaskStatus = 0;
  312. m_iEclapsed = 0;
  313. ShowTaskFieldStatus();
  314. // 从IDPMS获取数据
  315. IDPMSManager *pManager = IDPMSManager::GetManager();
  316. BOOL bRet = pManager->CloseIDPMSProject();
  317. if (!bRet) {
  318. LOG::D(_T("IDPMS 通讯异常"));
  319. }
  320. }
  321. /**************************************************************************************************
  322. 函 数 名 :ShowTaskFieldStatus
  323. 功能描述 :初始化任务信息
  324. 输入参数 :略
  325. 输出参数 :略
  326. 返 回 值 :略
  327. **************************************************************************************************/
  328. void CDynamicTask::ShowTaskFieldStatus()
  329. {
  330. if (m_iTaskStatus == TASK_STATUS_0) {
  331. m_Btn_Start.ShowWindow(SW_SHOW);
  332. m_Btn_Finish.ShowWindow(SW_HIDE);
  333. m_BtnStop.ShowWindow(SW_HIDE);
  334. m_BtnStop.SetWindowText(_T("暂停"));
  335. m_Static_Label_TimeSpan.ShowWindow(SW_HIDE);
  336. m_Combox_Frequency.ShowWindow(SW_HIDE);
  337. m_Static_Label_Second.ShowWindow(SW_HIDE);
  338. }
  339. else if (m_iTaskStatus == TASK_STATUS_RUNNING)
  340. {
  341. m_Btn_Start.ShowWindow(SW_HIDE);
  342. m_Btn_Finish.ShowWindow(SW_SHOW);
  343. m_BtnStop.ShowWindow(SW_SHOW);
  344. m_Static_Label_TimeSpan.ShowWindow(SW_SHOW);
  345. m_Combox_Frequency.ShowWindow(SW_SHOW);
  346. m_Static_Label_Second.ShowWindow(SW_SHOW);
  347. }
  348. else if (m_iTaskStatus == TASK_STATUS_PAUSED)
  349. {
  350. m_Btn_Start.ShowWindow(SW_HIDE);
  351. m_Btn_Report.ShowWindow(SW_SHOW);
  352. m_BtnStop.ShowWindow(SW_SHOW);
  353. m_Static_Label_TimeSpan.ShowWindow(SW_SHOW);
  354. m_Combox_Frequency.ShowWindow(SW_SHOW);
  355. m_Static_Label_Second.ShowWindow(SW_SHOW);
  356. }
  357. if (m_iTaskStatus == TASK_STATUS_0)
  358. {
  359. m_Static_MeasureTime.ShowWindow(SW_HIDE);
  360. m_Static_Angle_A_Label.ShowWindow(SW_HIDE);
  361. m_Static_Angle_AX.ShowWindow(SW_HIDE);
  362. m_Static_Angle_AY.ShowWindow(SW_HIDE);
  363. m_Static_Angle_AZ.ShowWindow(SW_HIDE);
  364. m_Static_Angle_E_Label.ShowWindow(SW_HIDE);
  365. m_Static_Angle_EX.ShowWindow(SW_HIDE);
  366. m_Static_Angle_EY.ShowWindow(SW_HIDE);
  367. m_Static_Angle_EZ.ShowWindow(SW_HIDE);
  368. m_Static_Thrust_Label.ShowWindow(SW_HIDE);
  369. m_Static_Line_Start.ShowWindow(SW_HIDE);
  370. m_Static_Line_End.ShowWindow(SW_HIDE);
  371. }
  372. else
  373. {
  374. m_Static_MeasureTime.ShowWindow(SW_SHOW);
  375. m_Static_Angle_A_Label.ShowWindow(SW_SHOW);
  376. m_Static_Angle_AX.ShowWindow(SW_SHOW);
  377. m_Static_Angle_AY.ShowWindow(SW_SHOW);
  378. m_Static_Angle_AZ.ShowWindow(SW_SHOW);
  379. m_Static_Angle_E_Label.ShowWindow(SW_SHOW);
  380. m_Static_Angle_EX.ShowWindow(SW_SHOW);
  381. m_Static_Angle_EY.ShowWindow(SW_SHOW);
  382. m_Static_Angle_EZ.ShowWindow(SW_SHOW);
  383. m_Static_Thrust_Label.ShowWindow(SW_SHOW);
  384. m_Static_Line_Start.ShowWindow(SW_SHOW);
  385. m_Static_Line_End.ShowWindow(SW_SHOW);
  386. }
  387. if (!m_bExecuted)
  388. {
  389. m_Btn_Compare.ShowWindow(SW_HIDE);
  390. m_Btn_Report.ShowWindow(SW_HIDE);
  391. }
  392. else
  393. {
  394. m_Btn_Compare.ShowWindow(SW_SHOW);
  395. m_Btn_Report.ShowWindow(SW_SHOW);
  396. }
  397. }
  398. /**************************************************************************************************
  399. 函 数 名 :InitEquipPlaceList
  400. 功能描述 :初始化任务信息
  401. 输入参数 :略
  402. 输出参数 :略
  403. 返 回 值 :略
  404. **************************************************************************************************/
  405. void CDynamicTask::InitEquipPlaceList()
  406. {
  407. m_Combo_EquipPlace.ResetContent();
  408. // 模型文件
  409. CStringArray arrModel;
  410. arrModel.Add(m_szEquipTypeCode);
  411. // 初始化数据
  412. EquipTypePlaceManager *pPlaceManager = m_pDoc->GetEquipTypePlaceManager();
  413. ASSERT(pPlaceManager != NULL);
  414. int i = 0;
  415. CppSQLite3Query q = pPlaceManager->Query(m_szEquipTypeCode);
  416. while (!q.eof()) {
  417. CString szEquipPlace = q.getStringField("equip_type_place");
  418. m_Combo_EquipPlace.AddString(szEquipPlace);
  419. arrModel.Add(szEquipPlace);
  420. q.nextRow();
  421. }
  422. q.finalize();
  423. // 默认选中第1个
  424. m_idxEquipPlace = 0;
  425. CString szEquipPlaceSel;
  426. if (m_Combo_EquipPlace.GetCount() > 0)
  427. {
  428. m_Combo_EquipPlace.SetCurSel(m_idxEquipPlace);
  429. m_Combo_EquipPlace.GetLBText(0, szEquipPlaceSel);
  430. }
  431. // 初始化型号三维展示
  432. BOOL bModelExist = IsModelExist(m_szEquipTypeCode, arrModel);
  433. if (!bModelExist)
  434. {
  435. m_Btn_Start.EnableWindow(FALSE);
  436. MessageBox(_T("模型文件不完整,请联系管理员!"));
  437. return;
  438. }
  439. m_Btn_Start.EnableWindow(TRUE);
  440. m_pOSGView->LoadOSG(m_szEquipTypeCode, arrModel);
  441. if (!szEquipPlaceSel.IsEmpty())
  442. {
  443. m_pOSGView->SetCurEquipPlace(szEquipPlaceSel);
  444. }
  445. }
  446. double g_fx = 0.0f;
  447. double g_fy = 0.0f;
  448. double g_fz = 0.0f;
  449. /**************************************************************************************************
  450. 函 数 名 :OnTimer
  451. 功能描述 :定时器消息
  452. 输入参数 :略
  453. 输出参数 :略
  454. 返 回 值 :略
  455. **************************************************************************************************/
  456. void CDynamicTask::OnTimer(UINT_PTR nIDEvent)
  457. {
  458. // 测量时间按秒类加
  459. m_iEclapsed++;
  460. switch (nIDEvent) {
  461. case MEASURE_TIMER:
  462. if (m_iEclapsed < 60)
  463. {
  464. m_szTimeCost.Format("%d秒", m_iEclapsed);
  465. }
  466. else if (m_iEclapsed < 3600)
  467. {
  468. m_szTimeCost.Format("%d分%d秒", m_iEclapsed/60, m_iEclapsed%60);
  469. }
  470. else
  471. {
  472. m_szTimeCost.Format("%d时%d分%d秒", m_iEclapsed/3600 , m_iEclapsed / 60, m_iEclapsed % 60);
  473. }
  474. UpdateData(FALSE);
  475. break;
  476. }
  477. CFormView::OnTimer(nIDEvent);
  478. }
  479. /**************************************************************************************************
  480. 函 数 名 :OnBnClickedBtnStarttask
  481. 功能描述 :事件处理-开始测量
  482. 输入参数 :略
  483. 输出参数 :略
  484. 返 回 值 :略
  485. **************************************************************************************************/
  486. void CDynamicTask::OnBnClickedBtnStartTask()
  487. {
  488. CString szResult;
  489. // 1. 未运行 -> 运行
  490. if (m_iTaskStatus == TASK_STATUS_0)
  491. {
  492. int idx = m_Combo_EquipPlace.GetCurSel();
  493. CString szEquipPlace;
  494. m_Combo_EquipPlace.GetLBText(idx, szEquipPlace);
  495. if (szEquipPlace.IsEmpty()) return;
  496. m_pOSGView->SetCurEquipPlace(szEquipPlace);
  497. m_bStopClicked = FALSE;
  498. // 调用IDPMS启动动态测量处理线程
  499. IDPMSManager *pManager = IDPMSManager::GetManager();
  500. pManager->StartDynamicProcThread(this, m_taskId, m_szEquipTypeCode, m_szEquipCode, szEquipPlace);
  501. }
  502. }
  503. /**************************************************************************************************
  504. 函 数 名 :OnMeasureSuccess
  505. 功能描述 :事件处理-测量成功WM-SUCCESS自定义消息处理
  506. 输入参数 :略
  507. 输出参数 :略
  508. 返 回 值 :略
  509. **************************************************************************************************/
  510. LRESULT CDynamicTask::OnMeasureSuccess(WPARAM wp, LPARAM lp)
  511. {
  512. if (m_iTaskStatus == TASK_STATUS_0)
  513. {
  514. m_iTaskStatus = TASK_STATUS_RUNNING;
  515. // 开始计算测量时间
  516. m_iEclapsed = 0;
  517. // 启动定时器
  518. SetTimer(MEASURE_TIMER, 1000, NULL);
  519. this->ShowTaskFieldStatus();
  520. m_bExecuted = TRUE;
  521. }
  522. // 接收消息包如果不为空,则释放资源
  523. DMSResponse *pMsg = (DMSResponse *)wp;
  524. if (pMsg != NULL)
  525. {
  526. Utils::DMS_FreeMsg(pMsg);
  527. }
  528. int idx = m_Combo_EquipPlace.GetCurSel();
  529. CString szEquipPlace;
  530. m_Combo_EquipPlace.GetLBText(idx, szEquipPlace);
  531. // 显示测量结果数据
  532. ShowDynamicTaskData(szEquipPlace);
  533. return 0;
  534. }
  535. /**************************************************************************************************
  536. 函 数 名 :OnMeasureFailure
  537. 功能描述 :测量失败WM-FAILURE自定义消息处理
  538. 输入参数 :略
  539. 输出参数 :略
  540. 返 回 值 :略
  541. **************************************************************************************************/
  542. LRESULT CDynamicTask::OnMeasureFailure(WPARAM wp, LPARAM lp)
  543. {
  544. if (m_iTaskStatus != TASK_STATUS_0)
  545. {
  546. m_iTaskStatus = TASK_STATUS_0;
  547. // 结束定时器
  548. if (m_iTaskStatus == TASK_STATUS_RUNNING)
  549. {
  550. KillTimer(MEASURE_TIMER);
  551. }
  552. this->ShowTaskFieldStatus();
  553. }
  554. // 接收消息包如果不为空,则释放资源
  555. DMSResponse *pMsg = (DMSResponse *)wp;
  556. if (pMsg != NULL)
  557. {
  558. CString szMsg(pMsg->szMsg);
  559. if (!szMsg.IsEmpty()) MessageBox(szMsg);
  560. Utils::DMS_FreeMsg(pMsg);
  561. }
  562. return 0;
  563. }
  564. /**************************************************************************************************
  565. 函 数 名 :OnMeasureComplete
  566. 功能描述 :事件处理-WM-COMPLETE自定义消息处理
  567. 输入参数 :略
  568. 输出参数 :略
  569. 返 回 值 :略
  570. **************************************************************************************************/
  571. LRESULT CDynamicTask::OnMeasureComplete(WPARAM wp, LPARAM lp)
  572. {
  573. // 保存数据到本地
  574. IDPMSManager *pManager = IDPMSManager::GetManager();
  575. DynamicData *pData = pManager->m_pDynamicData;
  576. pData->SaveToDB();
  577. // 更新任务为完成状态
  578. TaskManager *pTaskManager = m_pDoc->GetTaskManager();
  579. ASSERT(pTaskManager != NULL);
  580. pTaskManager->UpdateStatus(m_taskId, 1); // 1表示完成状态;
  581. // 任务重置为初始状态
  582. m_iTaskStatus = TASK_STATUS_0;
  583. // 重置视图功能
  584. this->ShowTaskFieldStatus();
  585. return 0;
  586. }
  587. /**************************************************************************************************
  588. 函 数 名 :OnBnClickedBtnFinish
  589. 功能描述 :事件处理-停止测量
  590. 输入参数 :略
  591. 输出参数 :略
  592. 返 回 值 :略
  593. **************************************************************************************************/
  594. void CDynamicTask::OnBnClickedBtnFinish()
  595. {
  596. if (m_iTaskStatus != TASK_STATUS_0)
  597. {
  598. m_bStopClicked = TRUE;
  599. // 调用IDPMS启动动态测量处理线程
  600. IDPMSManager *pManager = IDPMSManager::GetManager();
  601. pManager->StopDynamicTask();
  602. // 结束定时器
  603. if (m_iTaskStatus == TASK_STATUS_RUNNING)
  604. {
  605. KillTimer(MEASURE_TIMER);
  606. }
  607. }
  608. }
  609. /**************************************************************************************************
  610. 函 数 名 :OnBnClickedBtnPause
  611. 功能描述 :事件处理-暂停测量
  612. 输入参数 :略
  613. 输出参数 :略
  614. 返 回 值 :略
  615. **************************************************************************************************/
  616. void CDynamicTask::OnBnClickedBtnPause()
  617. {
  618. // 停止动态测量线程任务
  619. IDPMSManager *pManager = IDPMSManager::GetManager();
  620. if (m_iTaskStatus == TASK_STATUS_RUNNING)
  621. {
  622. pManager->PauseDynamicTask();
  623. m_pOSGView->RotateCurModel(0, 0, 0);
  624. m_BtnStop.SetWindowText(_T("继续执行"));
  625. m_iTaskStatus = TASK_STATUS_PAUSED;
  626. KillTimer(MEASURE_TIMER);
  627. }
  628. else if (m_iTaskStatus == TASK_STATUS_PAUSED)
  629. {
  630. pManager->ResumeDynamicTask();
  631. m_BtnStop.SetWindowText(_T("暂停"));
  632. m_iTaskStatus = TASK_STATUS_RUNNING;
  633. // 启动定时器
  634. SetTimer(MEASURE_TIMER, 1000, NULL);
  635. }
  636. // 更新UI状态
  637. this->ShowTaskFieldStatus();
  638. }
  639. /**************************************************************************************************
  640. 函 数 名 :OnBnClickedBtnBack
  641. 功能描述 :事件处理-结束返回
  642. 输入参数 :略
  643. 输出参数 :略
  644. 返 回 值 :略
  645. **************************************************************************************************/
  646. void CDynamicTask::OnBnClickedBtnBack()
  647. {
  648. // 隐视图
  649. this->ShowWindow(SW_HIDE);
  650. // 中止测量任务
  651. IDPMSManager *pManager = IDPMSManager::GetManager();
  652. pManager->StopDynamicTask();
  653. // 中止计时器
  654. if (m_iTaskStatus == TASK_STATUS_RUNNING)
  655. {
  656. KillTimer(MEASURE_TIMER);
  657. }
  658. // 重置任务状态
  659. m_iTaskStatus = TASK_STATUS_0;
  660. // 停止OSG渲染
  661. m_pOSGView->Terminate();
  662. // 重置UI栏位状态
  663. this->ResetFormData();
  664. // 切换视图
  665. CMainFrame *pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd;
  666. ::PostMessage(pMain->m_hWnd, WM_BACK_TO_START, NULL, NULL);
  667. }
  668. /**************************************************************************************************
  669. 函 数 名 :FetchDynamicTaskData
  670. 功能描述 :请求动态任务数据
  671. 输入参数 :略
  672. 输出参数 :略
  673. 返 回 值 :略
  674. **************************************************************************************************/
  675. BOOL CDynamicTask::FetchDynamicTaskData(LPCTSTR szEquipPlace)
  676. {
  677. // 初始化数据
  678. PostureDataAngleManager *pAngleManager = m_pDoc->GetPostureDataAngleManager();
  679. ASSERT(pAngleManager != NULL);
  680. CppSQLite3Query q = pAngleManager->Query(m_taskId, m_szEquipCode, szEquipPlace);
  681. if (!q.eof()) {
  682. m_szAngleAX = q.getStringField("angle_a_x");
  683. m_szAngleAY = q.getStringField("angle_a_y");
  684. m_szAngleAZ = q.getStringField("angle_a_z");
  685. m_szAngleEX = q.getStringField("angle_e_x");
  686. m_szAngleEY = q.getStringField("angle_e_y");
  687. m_szAngleEZ = q.getStringField("angle_e_z");
  688. DOUBLE lineStartX = q.getFloatField("line_start_x");
  689. DOUBLE lineStartY = q.getFloatField("line_start_y");
  690. DOUBLE lineStartZ = q.getFloatField("line_start_z");
  691. DOUBLE lineEndX = q.getFloatField("line_end_x");
  692. DOUBLE lineEndY = q.getFloatField("line_end_y");
  693. DOUBLE lineEndZ = q.getFloatField("line_end_z");
  694. m_szLineStart.Format("起点:(%.3f, %.3f, %.3f)", lineStartX, lineStartY, lineStartZ);
  695. m_szLineEnd.Format("终点:(%.3f, %.3f, %.3f)", lineEndX, lineEndY, lineEndZ);
  696. UpdateData(FALSE);
  697. q.finalize();
  698. return TRUE;
  699. }
  700. q.finalize();
  701. return FALSE;
  702. }
  703. /**************************************************************************************************
  704. 函 数 名 :OnBnClickedBtnCompareResult
  705. 功能描述 :事件处理-结果比对
  706. 输入参数 :无
  707. 输出参数 :无
  708. 返 回 值 :void
  709. **************************************************************************************************/
  710. void CDynamicTask::OnBnClickedBtnCompareResult()
  711. {
  712. CompareDlg dlg(this, m_taskId);
  713. dlg.DoModal();
  714. }
  715. /**************************************************************************************************
  716. 函 数 名 :OnBnClickedBtnOutputReport
  717. 功能描述 :事件处理-输出报告
  718. 输入参数 :略
  719. 输出参数 :略
  720. 返 回 值 :略
  721. **************************************************************************************************/
  722. void CDynamicTask::OnBnClickedBtnOutputReport()
  723. {
  724. // 显示报告视图
  725. DynamicReport dlg2(this, m_taskId);
  726. dlg2.DoModal();
  727. }
  728. /**************************************************************************************************
  729. 函 数 名 :OnSize
  730. 功能描述 :事件处理-WM-SIZE
  731. 输入参数 :略
  732. 输出参数 :略
  733. 返 回 值 :略
  734. **************************************************************************************************/
  735. void CDynamicTask::OnSize(UINT nType, int cx, int cy)
  736. {
  737. CFormView::OnSize(nType, cx, cy);
  738. if (m_pOSGView == NULL) return;
  739. CWnd *pWnd = this->GetDlgItem(IDC_STATIC_OSG);
  740. if (pWnd == NULL) return;
  741. CRect rect1;
  742. pWnd->GetWindowRect(&rect1);
  743. this->ScreenToClient(&rect1);
  744. m_pOSGView->MoveWindow(&rect1);
  745. }
  746. /**************************************************************************************************
  747. 函 数 名 :OnCbnSelchangeEquipPlace
  748. 功能描述 :分机选择事件处理
  749. 输入参数 :略
  750. 输出参数 :略
  751. 返 回 值 :略
  752. **************************************************************************************************/
  753. void CDynamicTask::OnCbnSelchangeEquipPlace()
  754. {
  755. // 获取当前选中索引
  756. int iSel = m_Combo_EquipPlace.GetCurSel();
  757. if (m_idxEquipPlace == iSel) return;
  758. // 测量任务正在进行中,不能改变部位
  759. if (m_iTaskStatus != TASK_STATUS_0)
  760. {
  761. m_Combo_EquipPlace.SetCurSel(m_idxEquipPlace);
  762. MessageBox(_T("请先停止测量,再改变设备部位"));
  763. return;
  764. }
  765. }
  766. /**************************************************************************************************
  767. 函 数 名 :ShowDynamicTaskData
  768. 功能描述 :显示动态任务数据
  769. 输入参数 :略
  770. 输出参数 :略
  771. 返 回 值 :略
  772. **************************************************************************************************/
  773. BOOL CDynamicTask::ShowDynamicTaskData(LPCTSTR szEquipPlace)
  774. {
  775. // 调用IDPMS启动动态测量处理线程
  776. IDPMSManager *pManager = IDPMSManager::GetManager();
  777. DynamicData *pData = pManager->m_pDynamicData;
  778. PostureDataAngle *pAngle = pData->GetAngle(m_taskId, szEquipPlace);
  779. if (pAngle != NULL) {
  780. m_szAngleAX.Format("%.3f", pAngle->GetAngleAX());
  781. m_szAngleAY.Format("%.3f", pAngle->GetAngleAY());
  782. m_szAngleAZ.Format("%.3f", pAngle->GetAngleAZ());
  783. // 1.推力线起终点
  784. DOUBLE fX1 = pAngle->GetLineStartX();
  785. DOUBLE fY1 = pAngle->GetLineStartY();
  786. DOUBLE fZ1 = pAngle->GetLineStartZ();
  787. DOUBLE fX2 = pAngle->GetLineEndX();
  788. DOUBLE fY2 = pAngle->GetLineEndY();
  789. DOUBLE fZ2 = pAngle->GetLineEndZ();
  790. // 2.计算偏角数据
  791. DOUBLE v1 = (fX1 - fX2);
  792. DOUBLE v2 = (fY1 - fY2);
  793. DOUBLE v3 = (fZ1 - fZ2);
  794. DOUBLE ax = atan(v2 / v3) * 180 / PI;
  795. DOUBLE ay = atan(v1 / v3) * 180 / PI;
  796. DOUBLE az = atan(0) * 180 / PI;
  797. m_pOSGView->RotateCurModel(ax, ay, az);
  798. // Test
  799. //double ty = 20 - 1 * m_iEclapsed;
  800. //m_pOSGView->RotateCurModel(0, ty, 0);
  801. m_szAngleEX.Format("%.3f", pAngle->GetAngleEX());
  802. m_szAngleEY.Format("%.3f", pAngle->GetAngleEY());
  803. m_szAngleEZ.Format("%.3f", pAngle->GetAngleEZ());
  804. DOUBLE lineStartX = pAngle->GetLineStartX();
  805. DOUBLE lineStartY = pAngle->GetLineStartY();
  806. DOUBLE lineStartZ = pAngle->GetLineStartZ();
  807. DOUBLE lineEndX = pAngle->GetLineEndX();
  808. DOUBLE lineEndY = pAngle->GetLineEndY();
  809. DOUBLE lineEndZ = pAngle->GetLineEndZ();
  810. m_szLineStart.Format("起点:(%.3f, %.3f, %.3f)", lineStartX, lineStartY, lineStartZ);
  811. m_szLineEnd.Format("终点:(%.3f, %.3f, %.3f)", lineEndX, lineEndY, lineEndZ);
  812. UpdateData(FALSE);
  813. return TRUE;
  814. }
  815. return FALSE;
  816. }
  817. /**************************************************************************************************
  818. 函 数 名 :OnCbnSelchangeComboTimespan
  819. 功能描述 :事件处理-修改动态测量时间间隔
  820. 输入参数 :略
  821. 输出参数 :略
  822. 返 回 值 :略
  823. **************************************************************************************************/
  824. void CDynamicTask::OnCbnSelchangeComboTimespan()
  825. {
  826. int idx = m_Combox_Frequency.GetCurSel();
  827. DWORD dwFrequency = (DWORD)m_Combox_Frequency.GetItemData(idx);
  828. DWORD dwNow = GetTickCount();
  829. DWORD dwTimeSpan = 1000 / dwFrequency;
  830. IDPMSManager *pManager = IDPMSManager::GetManager();
  831. pManager->SetDynamicTaskTimeSpan(dwTimeSpan);
  832. }
  833. /**************************************************************************************************
  834. 函 数 名 :OnBnClickedBtnDoubleCameraConfig
  835. 功能描述 :事件处理-双相机标定
  836. 输入参数 :略
  837. 输出参数 :略
  838. 返 回 值 :略
  839. **************************************************************************************************/
  840. void CDynamicTask::OnBnClickedBtnCamConfig()
  841. {
  842. DbCamConfigDlg dlg(this, m_szEquipTypeCode, m_szEquipCode);
  843. if (dlg.DoModal() == IDOK)
  844. {
  845. }
  846. }
  847. /**************************************************************************************************
  848. 函 数 名 :OnRestartIDPMS
  849. 功能描述 :WM_RESTART_IDPMS处理
  850. 输入参数 :略
  851. 输出参数 :略
  852. 返 回 值 :略
  853. **************************************************************************************************/
  854. afx_msg LRESULT CDynamicTask::OnReStartIDPMS(WPARAM wp, LPARAM lp)
  855. {
  856. // 从IDPMS获取数据
  857. IDPMSManager *pManager = IDPMSManager::GetManager();
  858. BOOL bRet = pManager->StartIDPMS2();
  859. if (!bRet)
  860. {
  861. MessageBox(_T("IDPMS引擎启动失败!"));
  862. }
  863. return 0;
  864. }
  865. /**************************************************************************************************
  866. 函 数 名 :OnDestroy
  867. 功能描述 :事件处理-WM-DESTORY
  868. 输入参数 :略
  869. 输出参数 :略
  870. 返 回 值 :略
  871. **************************************************************************************************/
  872. void CDynamicTask::OnDestroy()
  873. {
  874. CFormView::OnDestroy();
  875. if (m_pOSGView != NULL)
  876. {
  877. delete m_pOSGView;
  878. m_pOSGView = NULL;
  879. }
  880. }
  881. /**************************************************************************************************
  882. 函 数 名 :OnStnClickedStaticAddPlace
  883. 功能描述 :事件处理-新增设备部位
  884. 输入参数 :略
  885. 输出参数 :略
  886. 返 回 值 :略
  887. **************************************************************************************************/
  888. void CDynamicTask::OnStnClickedStaticAddPlace()
  889. {
  890. EquipTypePlaceDlg dlg(this, m_szEquipTypeCode);
  891. if (dlg.DoModal() == IDOK) {
  892. this->InitEquipPlaceList();
  893. }
  894. return;
  895. }