StaticTaskThread.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. /**************************************************************************************************
  2. 版本所有(C), 2020-2022, 北京普达迪泰
  3. ***************************************************************************************************
  4. 文 件 名: StaticTaskThread.h
  5. 功能描述: IDPMS静态任务处理
  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 "StaticTaskThread.h"
  18. #include "EquipDataManager.h"
  19. #include "EquipDataCircleManager.h"
  20. #include "EquipDataPlaneManager.h"
  21. #include "EquipDataLineManager.h"
  22. #include "EquipDataPointManager.h"
  23. #include "TaskManager.h"
  24. #include "IDPMSComm.h"
  25. #include "StaticData.h"
  26. CString g_szTaskPrjFolderName(_T(""));
  27. IMPLEMENT_DYNCREATE(StaticTaskThread, CUIThread)
  28. BEGIN_MESSAGE_MAP(StaticTaskThread, CWinThread)
  29. // {{AFX_MSG_MAP(CARTDevSearchTask)
  30. // NOTE - the ClassWizard will add and remove mapping macros here.
  31. ON_THREAD_MESSAGE(WM_STATIC, OnStatic)
  32. ON_THREAD_MESSAGE(WM_STATIC_DATA, OnStaticData)
  33. //}}AFX_MSG_MAP
  34. END_MESSAGE_MAP()
  35. StaticTaskThread::StaticTaskThread(void)
  36. {
  37. }
  38. StaticTaskThread::~StaticTaskThread(void)
  39. {
  40. }
  41. BOOL StaticTaskThread::InitInstance()
  42. {
  43. return TRUE;
  44. }
  45. /**************************************************************************************************
  46. 函 数 名 :GetPhotoPath
  47. 功能描述 :获取最新像片路径
  48. 输入参数 :略
  49. 输出参数 :无
  50. 返 回 值 :void
  51. **************************************************************************************************/
  52. BOOL StaticTaskThread::GetPhotoPath(CString &szTargetPath)
  53. {
  54. CString szPhotoDir = AppConfig::GetString(_T("Directory"), _T("PhotoDir"));
  55. if (szPhotoDir.IsEmpty()) return FALSE;
  56. CFileFind finder;
  57. CString szSearchDir;
  58. szSearchDir.Format("%s%s",szPhotoDir, _T("\\*.*"));
  59. BOOL bFound = finder.FindFile(szSearchDir);
  60. CTime time0 = 0;
  61. CString szTargetDir;
  62. while (bFound) {
  63. bFound = finder.FindNextFile();
  64. CString szPath = finder.GetFilePath();
  65. if (finder.IsDirectory() && !finder.IsDots()) {
  66. CString szDirName = finder.GetFileName();
  67. CFileStatus fileStatus;
  68. CFile::GetStatus(szPhotoDir + "\\" + szDirName, fileStatus);
  69. CTime time1 = fileStatus.m_ctime;
  70. if (time0 < time1) {
  71. szTargetDir = szDirName;
  72. time0 = time1;
  73. }
  74. }
  75. }
  76. if (szTargetDir.IsEmpty()) return FALSE;
  77. szTargetPath.Append(szPhotoDir);
  78. szTargetPath.Append(_T("\\"));
  79. szTargetPath.Append(szTargetDir);
  80. return TRUE;
  81. }
  82. /**************************************************************************************************
  83. 函 数 名 :OnStatic
  84. 功能描述 :静态零位测量
  85. 输入参数 :略
  86. 输出参数 :无
  87. 返 回 值 :void
  88. **************************************************************************************************/
  89. BOOL StaticTaskThread::SendCommandAndAckHandle(IDPMSComm *&pComm, CString& szCommand, DMSResponse *&pRes) {
  90. int iRet = pComm->SendCommand(szCommand, pRes);
  91. if (iRet == -1) {
  92. this->PostMsg(WM_START_IDPMS, pRes);
  93. delete pComm;
  94. return FALSE;
  95. }
  96. else if (iRet == 0) {
  97. this->PostMsg(WM_FAILURE, pRes);
  98. pComm->Close();
  99. delete pComm;
  100. pComm = NULL;
  101. return FALSE;
  102. }
  103. return TRUE;
  104. }
  105. /**************************************************************************************************
  106. 函 数 名 :OnStatic
  107. 功能描述 :静态零位测量
  108. 输入参数 :略
  109. 输出参数 :无
  110. 返 回 值 :void
  111. **************************************************************************************************/
  112. BOOL StaticTaskThread::SendCommandAndAckHandle(IDPMSComm *&pComm, CString& szCommand, LPCTSTR szEndFlag, DMSResponse *&pRes) {
  113. int iRet = pComm->SendCommand(szCommand, pRes, szEndFlag);
  114. if (iRet == -1) {
  115. this->PostMsg(WM_START_IDPMS, pRes);
  116. delete pComm;
  117. return FALSE;
  118. }
  119. else if (iRet == 0) {
  120. this->PostMsg(WM_FAILURE, pRes);
  121. pComm->Close();
  122. delete pComm;
  123. pComm = NULL;
  124. return FALSE;
  125. }
  126. return TRUE;
  127. }
  128. /**************************************************************************************************
  129. 函 数 名 :OnStatic
  130. 功能描述 :静态零位测量
  131. 输入参数 :略
  132. 输出参数 :无
  133. 返 回 值 :void
  134. **************************************************************************************************/
  135. void StaticTaskThread::OnStatic(WPARAM wParam,LPARAM lParam)
  136. {
  137. CString szCommand;
  138. BOOL bRet = TRUE;
  139. DMSResponse *pRes = NULL;
  140. CString szPhotoPath;
  141. // 获取像片路径
  142. bRet = this->GetPhotoPath(szPhotoPath);
  143. if (!bRet) {
  144. LOG::E(_T("像片路径不存在"));
  145. this->PostMsg(WM_FAILURE, pRes);
  146. return;
  147. }
  148. // IDPMS通讯器
  149. IDPMSComm *pComm = new IDPMSComm();
  150. bRet = pComm->Open();
  151. if (!bRet) {
  152. this->PostMsg(WM_START_IDPMS, pRes);
  153. delete pComm;
  154. return;
  155. }
  156. // 1.删除当前工程
  157. //szCommand.Format("idpms-cd:set0003");
  158. //bRet = SendCommandAndAckHandle(pComm, szCommand, pRes);
  159. //bret = sendcommandandackhandle(pcomm, szcommand, pres);
  160. // if (!bRet) return ;
  161. // 2.删除之前的工程文件
  162. CString szCameraFolder;
  163. CString szPrjFolder;
  164. szPrjFolder.Format("%s_%s_单相机", m_szEquipTypeCode, m_szEquipCode);
  165. szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%s_%s_单相机", m_szEquipTypeCode, m_szEquipCode);
  166. bRet = Utils::DeleteFolder(szCameraFolder);
  167. if (!bRet){
  168. LOG::E(szCameraFolder, _T("删除失败"));
  169. szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%s_%s_单相机A", m_szEquipTypeCode, m_szEquipCode);
  170. szPrjFolder.Format("%s_%s_单相机A", m_szEquipTypeCode, m_szEquipCode);
  171. bRet = Utils::DeleteFolder(szCameraFolder);
  172. }
  173. g_szTaskPrjFolderName.Format("%s", szPrjFolder);
  174. //// 3.Copy相机驱动文件
  175. //CString szSourceCam("C:\\PD\\IDPMS\\工程\\1号相机\\平差数据\\PDDT-HCCAM_CLG1.cam");
  176. //CString szTargetCam;
  177. //szTargetCam.Format("C:\\Program Files\\PD\\IDPMS\\模板工程\\%s\\PDDT-HCCAM_CLG1.cam", m_szEquipTypeCode);
  178. //CopyFile(szSourceCam, szTargetCam, FALSE);
  179. // 3.Copy相机驱动文件
  180. CString szSourceCam("C:\\PD\\IDPMS\\工程\\1号相机\\平差数据\\PDDT-7103FDJ-01.cam");
  181. CString szTargetCam;
  182. szTargetCam.Format("C:\\Program Files\\PD\\IDPMS\\模板工程\\%s\\PDDT-7103FDJ-01.cam", m_szEquipTypeCode);
  183. CopyFile(szSourceCam, szTargetCam, FALSE);
  184. // 4.根据模板新建文件
  185. szCommand.Format("IDCMD0017(PDTL=%s,PDSV=%s,PDDT= false)", m_szEquipTypeCode, szPrjFolder);
  186. bRet = SendCommandAndAckHandle(pComm, szCommand, pRes);
  187. if (!bRet) return;
  188. Sleep(2000);
  189. // // 5.读取单相机相片
  190. // szCommand.Format("IDPMS-CD:SET0008");
  191. // iRet = pComm->SendCommand(szCommand, pRes);
  192. // if (iRet <= 0) {
  193. // this->PostMsg(WM_FAILURE, pRes);
  194. // pComm->Close();
  195. //delete pComm;
  196. // return ;
  197. // }
  198. // 6.读取当前路径下所有相片
  199. szCommand.Format("IDPMS-CD:SET1701:%s", szPhotoPath);
  200. bRet = SendCommandAndAckHandle(pComm, szCommand, pRes);
  201. if (!bRet) return;
  202. // 7.开始测量
  203. szCommand.Format("IDCMD0016(PDST=true,PDGO=true,PDCE=true,PDWN=false,PDFP=false,PDSS=true)");
  204. bRet = SendCommandAndAckHandle(pComm, szCommand, _T("CPDSimpleBundleStats"), pRes);
  205. if (!bRet) return;
  206. // 8.轴对准
  207. szCommand.Format("IDPMS-CD:SET3701:p1=CKO:p2=CKOY:p3=CKOZ:p1x=Y:p1y=Z:p1z=X:p2type=type:p3type=type:sys=frame");
  208. bRet = SendCommandAndAckHandle(pComm, szCommand, pRes);
  209. if (!bRet) return;
  210. // 9.生成当前型号测量数据
  211. //CString dataFile = AppConfig::GetString(_T("IDPMS"), _T("DataFile1"));
  212. CString newFileFind;
  213. bRet = GetFileName(szCameraFolder, _T("BDA3D"), newFileFind);
  214. if (!bRet) {
  215. this->PostMsg(WM_FAILURE, pRes);
  216. pComm->Close();
  217. delete pComm;
  218. return;
  219. }
  220. szCommand.Format("IDPMS-CD:SET6201:SUB6201:PDSD=false:PDNM=%s", newFileFind);
  221. bRet = SendCommandAndAckHandle(pComm, szCommand, pRes);
  222. if (!bRet) return;
  223. // 10.解析报告文件
  224. CString szFile;
  225. szFile.Format("C:\\PD\\IDPMS\\工程\\%s\\%s.txt", szPrjFolder, newFileFind);
  226. StaticData data(m_taskId, m_szEquipTypeCode, m_szEquipCode);
  227. data.LoadDataFromFile(szFile);
  228. // 11.保存到数据库
  229. CString szMsg;
  230. BOOL isValid = data.Validate(szMsg);
  231. data.SaveToDB();
  232. // 12.生成动态测量驱动TXT文件
  233. data.OutputConfig();
  234. // 13.清理内存
  235. data.Clear();
  236. if (!isValid) {
  237. if (pRes == NULL) pRes = (DMSResponse *)Utils::DMS_CreateMsg();
  238. DMSResponse *pMSG = (DMSResponse *)pRes;
  239. pMSG->bRet = FALSE;
  240. pMSG->iCode = 0;
  241. memset(pMSG->szMsg, 0, DMS_MSG_SIZE);
  242. strncat_s((char *)pMSG->szMsg, DMS_MSG_SIZE, szMsg.GetBuffer(), szMsg.GetLength());
  243. }
  244. else {
  245. if (pRes != NULL) {
  246. DMSResponse *pMSG = (DMSResponse *)pRes;
  247. memset(pMSG->szMsg, 0, DMS_MSG_SIZE);
  248. }
  249. }
  250. this->PostMsg(WM_SUCCESS, pRes);
  251. // 关闭通讯器
  252. pComm->Close();
  253. delete pComm;
  254. return;
  255. }
  256. /**************************************************************************************************
  257. 函 数 名 :GetPhotoPath
  258. 功能描述 :获取最新像片路径
  259. 输入参数 :略
  260. 输出参数 :无
  261. 返 回 值 :void
  262. **************************************************************************************************/
  263. BOOL StaticTaskThread::GetFileName(CString &szPath, CString szPrefix, CString &szTargetFile)
  264. {
  265. if (szPath.IsEmpty()) return FALSE;
  266. CString szTName;
  267. CFileFind ff;
  268. CString szFilter;
  269. szFilter.Format("%s\\%s*.TDX", szPath, szPrefix);
  270. BOOL bFound = ff.FindFile(szFilter);
  271. CTime time0 = 0;
  272. CString szTargetDir;
  273. while (bFound) {
  274. bFound = ff.FindNextFile();
  275. CString szPath = ff.GetFilePath();
  276. if (!ff.IsDirectory() && !ff.IsDots()) {
  277. if (szTName.IsEmpty()) {
  278. szTName = ff.GetFileTitle();
  279. }
  280. else if (szTName < ff.GetFileTitle()) {
  281. szTName = ff.GetFileTitle();
  282. }
  283. }
  284. }
  285. if (szTName.IsEmpty()) return FALSE;
  286. szTargetFile.Empty();
  287. szTargetFile.Append(szTName);
  288. return TRUE;
  289. }
  290. /**************************************************************************************************
  291. 函 数 名 :OnStatic
  292. 功能描述 :静态零位测量
  293. 输入参数 :略
  294. 输出参数 :无
  295. 返 回 值 :void
  296. **************************************************************************************************/
  297. void StaticTaskThread::OnStaticData(WPARAM wParam, LPARAM lParam)
  298. {
  299. CString szCommand;
  300. BOOL bRet = TRUE;
  301. int iRet = 0;
  302. DMSResponse *pRes = NULL;
  303. // IDPMS通讯器
  304. IDPMSComm *pComm = new IDPMSComm();
  305. bRet = pComm->Open();
  306. if (!bRet) {
  307. this->PostMsg(WM_START_IDPMS, pRes);
  308. delete pComm;
  309. return;
  310. }
  311. // 1.获取最新数据文件名
  312. CString newFileFind;
  313. CString szCameraFolder;
  314. szCameraFolder.Format("C:\\PD\\IDPMS\\工程\\%s", g_szTaskPrjFolderName);
  315. bRet = GetFileName(szCameraFolder, _T("BDA3D"), newFileFind);
  316. if (!bRet) {
  317. this->PostMsg(WM_UPDATE_FAILURE, pRes);
  318. pComm->Close();
  319. delete pComm;
  320. return;
  321. }
  322. // 2.生成最新数据
  323. szCommand.Format("IDPMS-CD:SET6201:SUB6201:PDSD=false:PDNM=%s", newFileFind);
  324. iRet = pComm->SendCommand(szCommand, pRes);
  325. if (iRet <= 0) {
  326. this->PostMsg(WM_UPDATE_FAILURE, pRes);
  327. pComm->Close();
  328. delete pComm;
  329. return;
  330. }
  331. // 3.解析报告文件
  332. CString szFile;
  333. szFile.Format("C:\\PD\\IDPMS\\工程\\%s\\%s.txt", g_szTaskPrjFolderName, newFileFind);
  334. StaticData data(m_taskId, m_szEquipTypeCode, m_szEquipCode);
  335. data.LoadDataFromFile(szFile);
  336. // 4.保存到数据库
  337. CString szMsg;
  338. BOOL isValidate = data.Validate(szMsg);
  339. data.SaveToDB();
  340. // 5.生成动态测量驱动TXT文件
  341. data.OutputConfig();
  342. // 6.清理内存
  343. data.Clear();
  344. if (!isValidate) {
  345. if (pRes == NULL) pRes = (DMSResponse *)Utils::DMS_CreateMsg();
  346. DMSResponse *pMSG = (DMSResponse *)pRes;
  347. pMSG->bRet = FALSE;
  348. pMSG->iCode = 0;
  349. strncat_s((char *)pMSG->szMsg, DMS_MSG_SIZE, szMsg.GetBuffer(), szMsg.GetLength());
  350. LOG::D(szMsg);
  351. }
  352. else
  353. {
  354. if (pRes != NULL) {
  355. DMSResponse *pMSG = (DMSResponse *)pRes;
  356. memset(pMSG->szMsg, 0, DMS_MSG_SIZE);
  357. }
  358. }
  359. this->PostMsg(WM_UPDATE_SUCCESS, pRes);
  360. // 关闭通讯器
  361. pComm->Close();
  362. delete pComm;
  363. return;
  364. }