/************************************************************************************************** 版本所有(C), 2020-2022, 北京普达迪泰 *************************************************************************************************** 文 件 名: DynamicData.cpp 功能描述: Dynamic Task任务数据 版 本 号: 1.00初版 作 者: HYF 生成日期; 2021-12-20 最近修改: 函数列表: 修改历史: 1.日 期 :2021-12-20 作 者 : HYF 修改内容 : 创建文件 **************************************************************************************************/ #include "pch.h" #include #include #include "DynamicData.h" #include "PostureDataAngle.h" #include "PostureDataPoint.h" #include "PostureDataAngleManager.h" #include "PostureDataPointManager.h" #include "EquipTypePlaceManager.h" #include "CppSQLite3.h" #include "DictManager.h" #include // DynamicData DynamicData::DynamicData() { m_pDictManager = new DictManager(); m_pSeamaphore = new CSemaphore(1, 1); } DynamicData::DynamicData(DWORD taskId, LPCTSTR szEquipTypeCode, LPCTSTR szEquipCode, LPCTSTR szEquipPlace) : m_taskId(taskId) , m_szEquipTypeCode(szEquipTypeCode) , m_szEquipCode(szEquipCode) , m_szEquipPlace(szEquipPlace) { m_pDictManager = new DictManager(); m_pSeamaphore = new CSemaphore(1, 1); } DynamicData::~DynamicData() { if (NULL != m_pDictManager) { delete m_pDictManager; m_pDictManager = NULL; } delete m_pSeamaphore; } /************************************************************************************************** 函 数 名 :Clear 功能描述 :清空数据 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::Clear() { while (!m_AngleList.IsEmpty()) { delete m_AngleList.RemoveHead(); } while (!m_PointList.IsEmpty()) { delete m_PointList.RemoveHead(); } } /************************************************************************************************** 函 数 名 :SaveToDB 功能描述 :批量存储到数据库 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::SaveToDB() { m_pSeamaphore->Lock(); SaveAngleToDB(); SavePointToDB(); m_pSeamaphore->Unlock(); } /************************************************************************************************** 函 数 名 :SaveLineToDB 功能描述 :存储Line到数据库 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::SaveAngleToDB() { POSITION pos; PostureDataAngle *pAngle = NULL; PostureDataAngleManager *pAngleManager = new PostureDataAngleManager(); pAngleManager->Delete(m_taskId, m_szEquipCode, m_szEquipPlace); BOOL bRet = TRUE; if (m_AngleList.GetCount() > 0) { pos = m_AngleList.GetHeadPosition(); while (pos != NULL) { pAngle = (PostureDataAngle *)m_AngleList.GetNext(pos); if (pAngle != NULL) { bRet = pAngleManager->Add(*pAngle); if (bRet != TRUE) { AfxMessageBox("推力线数据存储失败!"); break; } } } } delete pAngleManager; } /************************************************************************************************** 函 数 名 :SavePointToDB 功能描述 :存储Line到数据库 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::SavePointToDB() { POSITION pos; PostureDataPoint *pPoint = NULL; PostureDataPointManager *pPointManager = new PostureDataPointManager(); pPointManager->Delete(m_taskId); BOOL bRet = TRUE; if (m_PointList.GetCount() > 0) { pos = m_PointList.GetHeadPosition(); while (pos != NULL) { pPoint = (PostureDataPoint *)m_PointList.GetNext(pos); if (pPoint != NULL) { bRet = pPointManager->Add(*pPoint); if (bRet != TRUE) { AfxMessageBox("Point数据存储失败!"); break; } } } } delete pPointManager; } /************************************************************************************************** 函 数 名 :AddPoint 功能描述 :新增推力线关联点 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::AddPoint(PostureDataPoint *pNewPoint) { POSITION pos; PostureDataPoint *pPoint = NULL; pos = m_PointList.GetHeadPosition(); while (pos != NULL) { pPoint = (PostureDataPoint *)m_PointList.GetNext(pos); if (pPoint == NULL) break; CString szPointCode = pPoint->GetPointCode(); if (szPointCode.Compare(pNewPoint->GetPointCode()) == 0) { delete pPoint; m_PointList.RemoveAt(pos); } } CString szPointCode = pNewPoint->GetPointCode(); double szPointX = pNewPoint->GetPointAX(); double szPointY = pNewPoint->GetPointAY(); double szPointZ = pNewPoint->GetPointAZ(); pNewPoint->SetPointTitle(m_pDictManager->GetDictItemTitle(szPointCode, szPointCode)); pNewPoint->SetPointAX(szPointZ); pNewPoint->SetPointAY(szPointY); pNewPoint->SetPointAZ(-szPointX); m_PointList.AddTail(pNewPoint); } /************************************************************************************************** 函 数 名 :AddAngle 功能描述 :新增推力线关联点 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::AddAngle(PostureDataAngle *pNewAngle) { POSITION pos; PostureDataAngle *pAngle = NULL; pos = m_AngleList.GetHeadPosition(); while (pos != NULL) { pAngle = (PostureDataAngle *)m_AngleList.GetNext(pos); if (pAngle == NULL) break; CString szEquipPlace = pAngle->GetEquipPlace(); if (szEquipPlace.Compare(pNewAngle->GetEquipPlace()) == 0) { delete pAngle; m_AngleList.RemoveAt(pos); } } m_AngleList.AddTail(pNewAngle); } /************************************************************************************************** 函 数 名 :CalcAngle 功能描述 :新增推力线偏角 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::CalcAngle() { POSITION pos; PostureDataPoint *pPoint = NULL; PostureDataPoint *pAS1 = NULL; PostureDataPoint *pAE1 = NULL; CString szPoint1; CString szPoint2; // 获取分机用于计算推力线的起点和终点代号 EquipTypePlaceManager *pPlaceManager = new EquipTypePlaceManager(); CppSQLite3Query q = pPlaceManager->Query(m_szEquipTypeCode, m_szEquipPlace); if (q.eof()) { LOG::E("没有配置当前分机用于计算推力线偏角的起终点!"); q.finalize(); return; } szPoint1.Format("%s", q.getStringField("point_start")); szPoint2.Format("%s", q.getStringField("point_end")); q.finalize(); // 1.获取结点 pos = m_PointList.GetHeadPosition(); while (pos != NULL) { pPoint = (PostureDataPoint *)m_PointList.GetNext(pos); if (pPoint == NULL) break; CString szPointCode = pPoint->GetPointCode(); if (szPointCode.Compare(szPoint1) == 0) { pAS1 = pPoint; } else if (szPointCode.Compare(szPoint2) == 0) { pAE1 = pPoint; } } if ((pAS1 == NULL) || (pAE1 == NULL)) { LOG::E("推力线结点数据不完整!"); return; } // 2.获取坐标值 DOUBLE fX1 = pAS1->GetPointAX(); DOUBLE fY1 = pAS1->GetPointAY(); DOUBLE fZ1 = pAS1->GetPointAZ(); DOUBLE fX2 = pAE1->GetPointAX(); DOUBLE fY2 = pAE1->GetPointAY(); DOUBLE fZ2 = pAE1->GetPointAZ(); // 3.计算偏角数据 DOUBLE v1 = (fX2-fX1)*(fX2-fX1); DOUBLE v2 = (fY2-fY1)*(fY2-fY1); DOUBLE v3 = (fZ2-fZ1)*(fZ2-fZ1); DOUBLE fLength = sqrt(v1 + v2 + v3); DOUBLE ax = acos((fX2-fX1)/fLength) * 180 / PI; DOUBLE ay = acos((fY2-fY1)/fLength) * 180 / PI; DOUBLE az = acos((fZ2-fZ1)/fLength) * 180 / PI; // 4.计算调校量 DOUBLE ex = ax - 0; DOUBLE ey = ay - 90; DOUBLE ez = az - (11/6); // 5. 保存数据 PostureDataAngle *pAngle = new PostureDataAngle(); pAngle->SetTaskId(m_taskId); pAngle->SetEquipCode(m_szEquipCode); pAngle->SetEquipPlace(m_szEquipPlace); pAngle->SetLineId(1); pAngle->SetLineTitle("AS1AE1"); pAngle->SetLineCode("AS1AE1"); pAngle->SetLineStartX(fX1); pAngle->SetLineStartY(fY1); pAngle->SetLineStartZ(fZ1); pAngle->SetLineEndX(fX2); pAngle->SetLineEndY(fY2); pAngle->SetLineEndZ(fZ2); pAngle->SetAngleAX(ax); pAngle->SetAngleAY(ay); pAngle->SetAngleAZ(az); pAngle->SetAngleEX(ex); pAngle->SetAngleEY(ey); pAngle->SetAngleEZ(ez); this->AddAngle(pAngle); } /************************************************************************************************** 函 数 名 :CalcAngle 功能描述 :新增推力线偏角 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::CalcTestAngle() { POSITION pos; PostureDataPoint *pPoint = NULL; PostureDataPoint *pAS1 = NULL; PostureDataPoint *pAE1 = NULL; CString szPoint1("CODE1"); CString szPoint2("CODE2"); // 1.获取结点 pos = m_PointList.GetHeadPosition(); while (pos != NULL) { pPoint = (PostureDataPoint *)m_PointList.GetNext(pos); if (pPoint == NULL) break; CString szPointCode = pPoint->GetPointCode(); if (szPointCode.Compare(szPoint1) == 0) { pAS1 = pPoint; } else if (szPointCode.Compare(szPoint2) == 0) { pAE1 = pPoint; } } if ((pAS1 == NULL) || (pAE1 == NULL)) { LOG::E("推力线结点数据不完整!"); return; } // 2.获取坐标值 DOUBLE fX1 = pAS1->GetPointAX(); DOUBLE fY1 = pAS1->GetPointAY(); DOUBLE fZ1 = pAS1->GetPointAZ(); DOUBLE fX2 = pAE1->GetPointAX(); DOUBLE fY2 = pAE1->GetPointAY(); DOUBLE fZ2 = pAE1->GetPointAZ(); // 3.计算偏角数据 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( v1/v2) * 180 / PI; // 4.计算调校量 DOUBLE ex = ax - 0; DOUBLE ey = ay - 0; DOUBLE ez = az - (11 / 6); // 5. 保存数据 PostureDataAngle *pAngle = new PostureDataAngle(); pAngle->SetTaskId(m_taskId); pAngle->SetEquipCode(m_szEquipCode); pAngle->SetEquipPlace(m_szEquipPlace); pAngle->SetLineId(1); pAngle->SetLineTitle("AS1AE1"); pAngle->SetLineCode("AS1AE1"); pAngle->SetLineStartX(fX1); pAngle->SetLineStartY(fY1); pAngle->SetLineStartZ(fZ1); pAngle->SetLineEndX(fX2); pAngle->SetLineEndY(fY2); pAngle->SetLineEndZ(fZ2); pAngle->SetAngleAX(ax); pAngle->SetAngleAY(ay); pAngle->SetAngleAZ(az); pAngle->SetAngleEX(ex); pAngle->SetAngleEY(ey); pAngle->SetAngleEZ(ez); this->AddAngle(pAngle); } /************************************************************************************************** 函 数 名 :GetAngle 功能描述 :根据条件查询推力线偏角数据 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ PostureDataAngle* DynamicData::GetAngle(DWORD taskId, LPCTSTR szEquipPlace) { POSITION pos; PostureDataAngle *pAngle = NULL; if (m_taskId != taskId) return NULL; // 1.获取结点 pos = m_AngleList.GetHeadPosition(); while (pos != NULL) { pAngle = (PostureDataAngle *)m_PointList.GetNext(pos); if (pAngle == NULL) break; CString szEquipPlace = pAngle->GetEquipPlace(); if (szEquipPlace.Compare(szEquipPlace) == 0) { return pAngle; } } return NULL; } /************************************************************************************************** 函 数 名 :PrintData 功能描述 :调试打印 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void DynamicData::PrintData() { CStdioFile file; CString szFile("D:\\data2.txt"); if (!file.Open(szFile, CFile::typeText|CFile::modeCreate|CFile::modeReadWrite)) { LOG::E(_T("打开文件失败")); return ; } this->PrintPoint(&file); this->PrintAngle(&file); file.Close(); } // 打印输出点数据 void DynamicData::PrintPoint(CStdioFile *pFile) { POSITION pos; PostureDataPoint *pPoint = NULL; CString szLine; szLine.Format("------------------------------------------------------------------------------------\n"); pFile->WriteString(szLine); szLine.Format("taskId equipCode equipPlace pointId pointTitle pointAX pointAY pointAZ \n"); pFile->WriteString(szLine); pos = m_PointList.GetHeadPosition(); while (pos != NULL) { pPoint = (PostureDataPoint *)m_PointList.GetNext(pos); if (pPoint != NULL) { szLine.Format(" %d %20s %20s %d %s %.3f %.3f %.3f\n" ,pPoint->GetTaskId() ,pPoint->GetEquipCode() ,pPoint->GetEquipPlace() ,pPoint->GetPointId() ,pPoint->GetPointTitle() ,pPoint->GetPointAX() ,pPoint->GetPointAY() ,pPoint->GetPointAZ()); pFile->WriteString(szLine); } } } // 打印输出Angle void DynamicData::PrintAngle(CStdioFile *pFile) { POSITION pos; PostureDataAngle *pAngle = NULL; CString szLine; szLine.Format("-------------------------------------------------------------------------------------------------------------------------\n"); pFile->WriteString(szLine); szLine.Format(" taskId equipCode equipPlace lineid lineTitle lineCode startx starty starty endx endy endz anglex angley anglez\n"); pFile->WriteString(szLine); pos = m_AngleList.GetHeadPosition(); while (pos != NULL) { pAngle = (PostureDataAngle *)m_AngleList.GetNext(pos); if (pAngle != NULL) { szLine.Format(" %10d %20s %20s %d %20s %20s [%.3f %.3f %.3f] [%.3f %.3f %.3f] [%.3f %.3f %.3f]\n" ,pAngle->GetTaskId() ,pAngle->GetEquipCode() ,pAngle->GetEquipPlace() ,pAngle->GetLineId() ,pAngle->GetLineTitle() ,pAngle->GetLineCode() ,pAngle->GetLineStartX() ,pAngle->GetLineStartY() ,pAngle->GetLineStartY() ,pAngle->GetLineEndX() ,pAngle->GetLineEndY() ,pAngle->GetLineEndY() ,pAngle->GetAngleAX() ,pAngle->GetAngleAY() ,pAngle->GetAngleAZ()); pFile->WriteString(szLine); } } }