DynamicData.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. /**************************************************************************************************
  2. 版本所有(C), 2020-2022, 北京普达迪泰
  3. ***************************************************************************************************
  4. 文 件 名: DynamicData.cpp
  5. 功能描述: Dynamic Task任务数据
  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 <afx.h>
  18. #include <afxtempl.h>
  19. #include "DynamicData.h"
  20. #include "PostureDataAngle.h"
  21. #include "PostureDataPoint.h"
  22. #include "PostureDataAngleManager.h"
  23. #include "PostureDataPointManager.h"
  24. #include "EquipTypePlaceManager.h"
  25. #include "CppSQLite3.h"
  26. #include "DictManager.h"
  27. #include <math.h>
  28. // DynamicData
  29. DynamicData::DynamicData()
  30. {
  31. m_pDictManager = new DictManager();
  32. m_pSeamaphore = new CSemaphore(1, 1);
  33. }
  34. DynamicData::DynamicData(DWORD taskId, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode, LPCTSTR szEquipPlace)
  35. : m_taskId(taskId)
  36. , m_szEquipTypeCode(szEquipTypeCode)
  37. , m_szEquipCode(szEquipCode)
  38. , m_szEquipPlace(szEquipPlace)
  39. {
  40. m_pDictManager = new DictManager();
  41. m_pSeamaphore = new CSemaphore(1, 1);
  42. }
  43. DynamicData::~DynamicData()
  44. {
  45. if (NULL != m_pDictManager) {
  46. delete m_pDictManager;
  47. m_pDictManager = NULL;
  48. }
  49. delete m_pSeamaphore;
  50. }
  51. /**************************************************************************************************
  52. 函 数 名 :Clear
  53. 功能描述 :清空数据
  54. 输入参数 :无
  55. 输出参数 :无
  56. 返 回 值 :void
  57. **************************************************************************************************/
  58. void DynamicData::Clear()
  59. {
  60. while (!m_AngleList.IsEmpty())
  61. {
  62. delete m_AngleList.RemoveHead();
  63. }
  64. while (!m_PointList.IsEmpty())
  65. {
  66. delete m_PointList.RemoveHead();
  67. }
  68. }
  69. /**************************************************************************************************
  70. 函 数 名 :SaveToDB
  71. 功能描述 :批量存储到数据库
  72. 输入参数 :无
  73. 输出参数 :无
  74. 返 回 值 :void
  75. **************************************************************************************************/
  76. void DynamicData::SaveToDB()
  77. {
  78. m_pSeamaphore->Lock();
  79. SaveAngleToDB();
  80. SavePointToDB();
  81. m_pSeamaphore->Unlock();
  82. }
  83. /**************************************************************************************************
  84. 函 数 名 :SaveLineToDB
  85. 功能描述 :存储Line到数据库
  86. 输入参数 :无
  87. 输出参数 :无
  88. 返 回 值 :void
  89. **************************************************************************************************/
  90. void DynamicData::SaveAngleToDB()
  91. {
  92. POSITION pos;
  93. PostureDataAngle *pAngle = NULL;
  94. PostureDataAngleManager *pAngleManager = new PostureDataAngleManager();
  95. pAngleManager->Delete(m_taskId, m_szEquipCode, m_szEquipPlace);
  96. BOOL bRet = TRUE;
  97. if (m_AngleList.GetCount() > 0)
  98. {
  99. pos = m_AngleList.GetHeadPosition();
  100. while (pos != NULL)
  101. {
  102. pAngle = (PostureDataAngle *)m_AngleList.GetNext(pos);
  103. if (pAngle != NULL)
  104. {
  105. bRet = pAngleManager->Add(*pAngle);
  106. if (bRet != TRUE)
  107. {
  108. AfxMessageBox("推力线数据存储失败!");
  109. break;
  110. }
  111. }
  112. }
  113. }
  114. delete pAngleManager;
  115. }
  116. /**************************************************************************************************
  117. 函 数 名 :SavePointToDB
  118. 功能描述 :存储Line到数据库
  119. 输入参数 :无
  120. 输出参数 :无
  121. 返 回 值 :void
  122. **************************************************************************************************/
  123. void DynamicData::SavePointToDB()
  124. {
  125. POSITION pos;
  126. PostureDataPoint *pPoint = NULL;
  127. PostureDataPointManager *pPointManager = new PostureDataPointManager();
  128. pPointManager->Delete(m_taskId);
  129. BOOL bRet = TRUE;
  130. if (m_PointList.GetCount() > 0)
  131. {
  132. pos = m_PointList.GetHeadPosition();
  133. while (pos != NULL)
  134. {
  135. pPoint = (PostureDataPoint *)m_PointList.GetNext(pos);
  136. if (pPoint != NULL)
  137. {
  138. bRet = pPointManager->Add(*pPoint);
  139. if (bRet != TRUE)
  140. {
  141. AfxMessageBox("Point数据存储失败!");
  142. break;
  143. }
  144. }
  145. }
  146. }
  147. delete pPointManager;
  148. }
  149. /**************************************************************************************************
  150. 函 数 名 :AddPoint
  151. 功能描述 :新增推力线关联点
  152. 输入参数 :无
  153. 输出参数 :无
  154. 返 回 值 :void
  155. **************************************************************************************************/
  156. void DynamicData::AddPoint(PostureDataPoint *pNewPoint)
  157. {
  158. POSITION pos;
  159. PostureDataPoint *pPoint = NULL;
  160. pos = m_PointList.GetHeadPosition();
  161. while (pos != NULL)
  162. {
  163. pPoint = (PostureDataPoint *)m_PointList.GetNext(pos);
  164. if (pPoint == NULL) break;
  165. CString szPointCode = pPoint->GetPointCode();
  166. if (szPointCode.Compare(pNewPoint->GetPointCode()) == 0)
  167. {
  168. delete pPoint;
  169. m_PointList.RemoveAt(pos);
  170. }
  171. }
  172. CString szPointCode = pNewPoint->GetPointCode();
  173. double szPointX = pNewPoint->GetPointAX();
  174. double szPointY = pNewPoint->GetPointAY();
  175. double szPointZ = pNewPoint->GetPointAZ();
  176. pNewPoint->SetPointTitle(m_pDictManager->GetDictItemTitle(szPointCode, szPointCode));
  177. pNewPoint->SetPointAX(szPointZ);
  178. pNewPoint->SetPointAY(szPointY);
  179. pNewPoint->SetPointAZ(-szPointX);
  180. m_PointList.AddTail(pNewPoint);
  181. }
  182. /**************************************************************************************************
  183. 函 数 名 :AddAngle
  184. 功能描述 :新增推力线关联点
  185. 输入参数 :无
  186. 输出参数 :无
  187. 返 回 值 :void
  188. **************************************************************************************************/
  189. void DynamicData::AddAngle(PostureDataAngle *pNewAngle)
  190. {
  191. POSITION pos;
  192. PostureDataAngle *pAngle = NULL;
  193. pos = m_AngleList.GetHeadPosition();
  194. while (pos != NULL)
  195. {
  196. pAngle = (PostureDataAngle *)m_AngleList.GetNext(pos);
  197. if (pAngle == NULL) break;
  198. CString szEquipPlace = pAngle->GetEquipPlace();
  199. if (szEquipPlace.Compare(pNewAngle->GetEquipPlace()) == 0)
  200. {
  201. delete pAngle;
  202. m_AngleList.RemoveAt(pos);
  203. }
  204. }
  205. m_AngleList.AddTail(pNewAngle);
  206. }
  207. /**************************************************************************************************
  208. 函 数 名 :CalcAngle
  209. 功能描述 :新增推力线偏角
  210. 输入参数 :无
  211. 输出参数 :无
  212. 返 回 值 :void
  213. **************************************************************************************************/
  214. void DynamicData::CalcAngle()
  215. {
  216. POSITION pos;
  217. PostureDataPoint *pPoint = NULL;
  218. PostureDataPoint *pAS1 = NULL;
  219. PostureDataPoint *pAE1 = NULL;
  220. CString szPoint1;
  221. CString szPoint2;
  222. // 获取分机用于计算推力线的起点和终点代号
  223. EquipTypePlaceManager *pPlaceManager = new EquipTypePlaceManager();
  224. CppSQLite3Query q = pPlaceManager->Query(m_szEquipTypeCode, m_szEquipPlace);
  225. if (q.eof()) {
  226. LOG::E("没有配置当前分机用于计算推力线偏角的起终点!");
  227. q.finalize();
  228. return;
  229. }
  230. szPoint1.Format("%s", q.getStringField("point_start"));
  231. szPoint2.Format("%s", q.getStringField("point_end"));
  232. q.finalize();
  233. // 1.获取结点
  234. pos = m_PointList.GetHeadPosition();
  235. while (pos != NULL)
  236. {
  237. pPoint = (PostureDataPoint *)m_PointList.GetNext(pos);
  238. if (pPoint == NULL) break;
  239. CString szPointCode = pPoint->GetPointCode();
  240. if (szPointCode.Compare(szPoint1) == 0)
  241. {
  242. pAS1 = pPoint;
  243. }
  244. else if (szPointCode.Compare(szPoint2) == 0)
  245. {
  246. pAE1 = pPoint;
  247. }
  248. }
  249. if ((pAS1 == NULL) || (pAE1 == NULL))
  250. {
  251. LOG::E("推力线结点数据不完整!");
  252. return;
  253. }
  254. // 2.获取坐标值
  255. DOUBLE fX1 = pAS1->GetPointAX();
  256. DOUBLE fY1 = pAS1->GetPointAY();
  257. DOUBLE fZ1 = pAS1->GetPointAZ();
  258. DOUBLE fX2 = pAE1->GetPointAX();
  259. DOUBLE fY2 = pAE1->GetPointAY();
  260. DOUBLE fZ2 = pAE1->GetPointAZ();
  261. // 3.计算偏角数据
  262. DOUBLE v1 = (fX2-fX1)*(fX2-fX1);
  263. DOUBLE v2 = (fY2-fY1)*(fY2-fY1);
  264. DOUBLE v3 = (fZ2-fZ1)*(fZ2-fZ1);
  265. DOUBLE fLength = sqrt(v1 + v2 + v3);
  266. DOUBLE ax = acos((fX2-fX1)/fLength) * 180 / PI;
  267. DOUBLE ay = acos((fY2-fY1)/fLength) * 180 / PI;
  268. DOUBLE az = acos((fZ2-fZ1)/fLength) * 180 / PI;
  269. // 4.计算调校量
  270. DOUBLE ex = ax - 0;
  271. DOUBLE ey = ay - 90;
  272. DOUBLE ez = az - (11/6);
  273. // 5. 保存数据
  274. PostureDataAngle *pAngle = new PostureDataAngle();
  275. pAngle->SetTaskId(m_taskId);
  276. pAngle->SetEquipCode(m_szEquipCode);
  277. pAngle->SetEquipPlace(m_szEquipPlace);
  278. pAngle->SetLineId(1);
  279. pAngle->SetLineTitle("AS1AE1");
  280. pAngle->SetLineCode("AS1AE1");
  281. pAngle->SetLineStartX(fX1);
  282. pAngle->SetLineStartY(fY1);
  283. pAngle->SetLineStartZ(fZ1);
  284. pAngle->SetLineEndX(fX2);
  285. pAngle->SetLineEndY(fY2);
  286. pAngle->SetLineEndZ(fZ2);
  287. pAngle->SetAngleAX(ax);
  288. pAngle->SetAngleAY(ay);
  289. pAngle->SetAngleAZ(az);
  290. pAngle->SetAngleEX(ex);
  291. pAngle->SetAngleEY(ey);
  292. pAngle->SetAngleEZ(ez);
  293. this->AddAngle(pAngle);
  294. }
  295. /**************************************************************************************************
  296. 函 数 名 :CalcAngle
  297. 功能描述 :新增推力线偏角
  298. 输入参数 :无
  299. 输出参数 :无
  300. 返 回 值 :void
  301. **************************************************************************************************/
  302. void DynamicData::CalcTestAngle()
  303. {
  304. POSITION pos;
  305. PostureDataPoint *pPoint = NULL;
  306. PostureDataPoint *pAS1 = NULL;
  307. PostureDataPoint *pAE1 = NULL;
  308. CString szPoint1("CODE1");
  309. CString szPoint2("CODE2");
  310. // 1.获取结点
  311. pos = m_PointList.GetHeadPosition();
  312. while (pos != NULL)
  313. {
  314. pPoint = (PostureDataPoint *)m_PointList.GetNext(pos);
  315. if (pPoint == NULL) break;
  316. CString szPointCode = pPoint->GetPointCode();
  317. if (szPointCode.Compare(szPoint1) == 0)
  318. {
  319. pAS1 = pPoint;
  320. }
  321. else if (szPointCode.Compare(szPoint2) == 0)
  322. {
  323. pAE1 = pPoint;
  324. }
  325. }
  326. if ((pAS1 == NULL) || (pAE1 == NULL))
  327. {
  328. LOG::E("推力线结点数据不完整!");
  329. return;
  330. }
  331. // 2.获取坐标值
  332. DOUBLE fX1 = pAS1->GetPointAX();
  333. DOUBLE fY1 = pAS1->GetPointAY();
  334. DOUBLE fZ1 = pAS1->GetPointAZ();
  335. DOUBLE fX2 = pAE1->GetPointAX();
  336. DOUBLE fY2 = pAE1->GetPointAY();
  337. DOUBLE fZ2 = pAE1->GetPointAZ();
  338. // 3.计算偏角数据
  339. DOUBLE v1 = (fX1 - fX2);
  340. DOUBLE v2 = (fY1 - fY2);
  341. DOUBLE v3 = (fZ1 - fZ2);
  342. DOUBLE ax = atan( v2 / v3) * 180 / PI;
  343. DOUBLE ay = atan( v1 / v3) * 180 / PI;
  344. DOUBLE az = atan( v1/v2) * 180 / PI;
  345. // 4.计算调校量
  346. DOUBLE ex = ax - 0;
  347. DOUBLE ey = ay - 0;
  348. DOUBLE ez = az - (11 / 6);
  349. // 5. 保存数据
  350. PostureDataAngle *pAngle = new PostureDataAngle();
  351. pAngle->SetTaskId(m_taskId);
  352. pAngle->SetEquipCode(m_szEquipCode);
  353. pAngle->SetEquipPlace(m_szEquipPlace);
  354. pAngle->SetLineId(1);
  355. pAngle->SetLineTitle("AS1AE1");
  356. pAngle->SetLineCode("AS1AE1");
  357. pAngle->SetLineStartX(fX1);
  358. pAngle->SetLineStartY(fY1);
  359. pAngle->SetLineStartZ(fZ1);
  360. pAngle->SetLineEndX(fX2);
  361. pAngle->SetLineEndY(fY2);
  362. pAngle->SetLineEndZ(fZ2);
  363. pAngle->SetAngleAX(ax);
  364. pAngle->SetAngleAY(ay);
  365. pAngle->SetAngleAZ(az);
  366. pAngle->SetAngleEX(ex);
  367. pAngle->SetAngleEY(ey);
  368. pAngle->SetAngleEZ(ez);
  369. this->AddAngle(pAngle);
  370. }
  371. /**************************************************************************************************
  372. 函 数 名 :GetAngle
  373. 功能描述 :根据条件查询推力线偏角数据
  374. 输入参数 :无
  375. 输出参数 :无
  376. 返 回 值 :void
  377. **************************************************************************************************/
  378. PostureDataAngle* DynamicData::GetAngle(DWORD taskId, LPCTSTR szEquipPlace)
  379. {
  380. POSITION pos;
  381. PostureDataAngle *pAngle = NULL;
  382. if (m_taskId != taskId) return NULL;
  383. // 1.获取结点
  384. pos = m_AngleList.GetHeadPosition();
  385. while (pos != NULL)
  386. {
  387. pAngle = (PostureDataAngle *)m_PointList.GetNext(pos);
  388. if (pAngle == NULL) break;
  389. CString szEquipPlace = pAngle->GetEquipPlace();
  390. if (szEquipPlace.Compare(szEquipPlace) == 0)
  391. {
  392. return pAngle;
  393. }
  394. }
  395. return NULL;
  396. }
  397. /**************************************************************************************************
  398. 函 数 名 :PrintData
  399. 功能描述 :调试打印
  400. 输入参数 :无
  401. 输出参数 :无
  402. 返 回 值 :void
  403. **************************************************************************************************/
  404. void DynamicData::PrintData()
  405. {
  406. CStdioFile file;
  407. CString szFile("D:\\data2.txt");
  408. if (!file.Open(szFile, CFile::typeText|CFile::modeCreate|CFile::modeReadWrite))
  409. {
  410. LOG::E(_T("打开文件失败"));
  411. return ;
  412. }
  413. this->PrintPoint(&file);
  414. this->PrintAngle(&file);
  415. file.Close();
  416. }
  417. // 打印输出点数据
  418. void DynamicData::PrintPoint(CStdioFile *pFile)
  419. {
  420. POSITION pos;
  421. PostureDataPoint *pPoint = NULL;
  422. CString szLine;
  423. szLine.Format("------------------------------------------------------------------------------------\n");
  424. pFile->WriteString(szLine);
  425. szLine.Format("taskId equipCode equipPlace pointId pointTitle pointAX pointAY pointAZ \n");
  426. pFile->WriteString(szLine);
  427. pos = m_PointList.GetHeadPosition();
  428. while (pos != NULL)
  429. {
  430. pPoint = (PostureDataPoint *)m_PointList.GetNext(pos);
  431. if (pPoint != NULL)
  432. {
  433. szLine.Format(" %d %20s %20s %d %s %.3f %.3f %.3f\n"
  434. ,pPoint->GetTaskId()
  435. ,pPoint->GetEquipCode()
  436. ,pPoint->GetEquipPlace()
  437. ,pPoint->GetPointId()
  438. ,pPoint->GetPointTitle()
  439. ,pPoint->GetPointAX()
  440. ,pPoint->GetPointAY()
  441. ,pPoint->GetPointAZ());
  442. pFile->WriteString(szLine);
  443. }
  444. }
  445. }
  446. // 打印输出Angle
  447. void DynamicData::PrintAngle(CStdioFile *pFile)
  448. {
  449. POSITION pos;
  450. PostureDataAngle *pAngle = NULL;
  451. CString szLine;
  452. szLine.Format("-------------------------------------------------------------------------------------------------------------------------\n");
  453. pFile->WriteString(szLine);
  454. szLine.Format(" taskId equipCode equipPlace lineid lineTitle lineCode startx starty starty endx endy endz anglex angley anglez\n");
  455. pFile->WriteString(szLine);
  456. pos = m_AngleList.GetHeadPosition();
  457. while (pos != NULL)
  458. {
  459. pAngle = (PostureDataAngle *)m_AngleList.GetNext(pos);
  460. if (pAngle != NULL)
  461. {
  462. szLine.Format(" %10d %20s %20s %d %20s %20s [%.3f %.3f %.3f] [%.3f %.3f %.3f] [%.3f %.3f %.3f]\n"
  463. ,pAngle->GetTaskId()
  464. ,pAngle->GetEquipCode()
  465. ,pAngle->GetEquipPlace()
  466. ,pAngle->GetLineId()
  467. ,pAngle->GetLineTitle()
  468. ,pAngle->GetLineCode()
  469. ,pAngle->GetLineStartX()
  470. ,pAngle->GetLineStartY()
  471. ,pAngle->GetLineStartY()
  472. ,pAngle->GetLineEndX()
  473. ,pAngle->GetLineEndY()
  474. ,pAngle->GetLineEndY()
  475. ,pAngle->GetAngleAX()
  476. ,pAngle->GetAngleAY()
  477. ,pAngle->GetAngleAZ());
  478. pFile->WriteString(szLine);
  479. }
  480. }
  481. }