#include "StdAfx.h" #include "ChartGlassData.h" CChartGlassData::CChartGlassData(void) { for(int i = 0; i < MAX_GLASS_COUNT; i++) { m_szGlassID[i] = new char[MAX_STR_LEN]; m_szRecipeID[i] = new char[MAX_STR_LEN]; m_szDateTime[i] = new char[MAX_STR_LEN]; } for (int j = 0; j < MAX_RESULT_COUNT; j++) { m_szResultName[j] = new char[MAX_STR_LEN]; } Reset(); /* enum SymbolType { NoSymbol = 0, SquareSymbol = 1, DiamondSymbol = 2, TriangleSymbol = 3, RightTriangleSymbol = 4, LeftTriangleSymbol = 5, InvertedTriangleSymbol = 6, CircleSymbol = 7, CrossSymbol = 8, Cross2Symbol = 9, ChartDir_PolygonSymbol = 11, ChartDir_Polygon2Symbol = 12, ChartDir_StarSymbol = 13, ChartDir_CustomSymbol = 14 }; */ } CChartGlassData::~CChartGlassData(void) { for (int i = 0; i < MAX_GLASS_COUNT; i++) { delete [] m_szGlassID[i]; m_szGlassID[i] = NULL; delete [] m_szRecipeID[i]; m_szRecipeID[i] = NULL; delete [] m_szDateTime[i]; m_szDateTime[i] = NULL; } for (int i=0; iGetMeasureResultCount(); for(int nModuleIdx=0; nModuleIdxGetSMeasureResultCount(nModuleIdx); for(int nResultIdx=0; nResultIdxGetSMeasureResult(nModuleIdx, nResultIdx); if (pNode==NULL) continue; int nFormulaCnt = (int)pNode->vecMeasure_ResultData.size(); //DX, DY Index Change; for(int i=0;ivecMeasure_ResultData[i].m_nResultCode) { if(pNode->vecMeasure_ResultData[i].m_strResultName.Compare(_T("DX"))==0) { nDxIndex = i; } if(pNode->vecMeasure_ResultData[i].m_strResultName.Compare(_T("DY"))==0) { nDyIndex = i; } } } if (nFormulaCnt > nMaxIndex) // formula { double dDxValue = pNode->vecMeasure_ResultData[nDxIndex].m_dResultValue; double dDyValue = pNode->vecMeasure_ResultData[nDyIndex].m_dResultValue; pResultValue[MeasureResult_AvgDx] += dDxValue; pResultValue[MeasureResult_AvgDy] += dDyValue; pResultValue[MeasureResult_MinDx] = min(pResultValue[MeasureResult_MinDx], dDxValue); pResultValue[MeasureResult_MinDy] = min(pResultValue[MeasureResult_MinDy], dDyValue); pResultValue[MeasureResult_MaxDx] = max(pResultValue[MeasureResult_MaxDx], dDxValue); pResultValue[MeasureResult_MaxDy] = max(pResultValue[MeasureResult_MaxDy], dDyValue); pResultCount[MeasureResult_AvgDx]++; pResultCount[MeasureResult_AvgDy]++; } //Information //WideCharToMultiByte(CP_ACP, 0, pGlassResult->m_strGlassID, -1, m_szGlassID[nGlassIndex], MAX_STR_LEN, NULL, NULL); } } // calculate average pResultValue[MeasureResult_AvgDx] = pResultValue[MeasureResult_AvgDx] / pResultCount[MeasureResult_AvgDx]; pResultValue[MeasureResult_AvgDy] = pResultValue[MeasureResult_AvgDy] / pResultCount[MeasureResult_AvgDy]; return TRUE; } void CChartGlassData::CString_to_charA(char *Dst ,CString Src,unsigned int size) { //Cstring을 Dst에 복사 size = (size*2)+1;//유니코드는 2바이트이므로 (2배 + (문자열종료 1바이트)) unsigned int i=0; char* p = (char*)(*(int*)&Src); for(i=0;i 0; i--) { for(int j=0;j strlen(pGlassResult->m_strGlassID)) ? strlen(pGlassResult->m_strGlassID) : sizeof(m_szGlassID); strncpy(*m_szGlassID, (LPSTR)(LPCSTR)pGlassResult->m_strGlassID, nLength); //WideCharToMultiByte(CP_ACP, 0, pGlassResult->m_strGlassID, -1, m_szGlassID[0], MAX_STR_LEN, NULL, NULL); //WideCharToMultiByte(CP_ACP, 0, pGlassResult->m_strRecipeID, -1, m_szRecipeID[nGlassIndex], MAX_STR_LEN, NULL, NULL); //WideCharToMultiByte(CP_ACP, 0, pGlassResult->m_strUnLoadingTime, -1, m_szDateTime[nGlassIndex], MAX_STR_LEN, NULL, NULL); // set zero double pResultValue[MAX_RESULT_COUNT]; memset(pResultValue, 0, sizeof(pResultValue)); // calculate result switch(nMode) { case UNIT_POINT: if (CalculateMeasureResult(pGlassResult, pResultValue)) { for (int nResultIdx=0; nResultIdxsetPlotArea(areaRect.left, areaRect.top, areaRect.Width(), areaRect.Height(), 0xffffff, -1, -1, 0xcccccc, 0xcccccc); pChart->addLegend(areaRect.left, 2, false, "arialbd.ttf", 9)->setBackground(Chart::Transparent); // if (m_nGlassCount<0) // { // pChart->makeChart(); // // return pChart; // } DrawGlassInfo(nMode, pChart); if(nType) DrawResultData(nMode, pChart, nType); else DrawResultData(nMode, pChart, nType); // Output the chart pChart->makeChart(); //include tool tip for the chart //imageMap = c->getHTMLImageMap("clickable", "Bold", "title='Index: {x}\nPPID: {field0}\nGlassID: {field1}\nTime: {field2}\nSucc: {field3}\nFail: {field4}'");//\nAvgValue:{field5}\nMaxValue:{field6}\nMinValue:{field7}"); //m_MeasureGraph.setImageMap(imageMap); switch(nMode) { case 0: *imageMap = pChart->getHTMLImageMap("clickable", "Bold", "title='Date, Time : {field1|yyyy-mm-dd hh:nn:ss}\nRecipeID : {value}\nGlassID : {xLabel}\nTotal Defect : {value} ea\nReview Defect : {field3} ea'"); break; case 1: *imageMap = pChart->getHTMLImageMap("clickable", "Bold", "title=' GlassID : {xLabel}\n Value : {value} um'"); break; } return pChart; } void CChartGlassData::DrawGlassInfo(int nMode, XYChart *pChart) { int nLineWidthX = 2; int nLineWidthY = 2; char strValue[50]; switch(nMode) { case 0: sprintf_s(strValue, 50, "Defect Count(ea)"); break; case 1: sprintf_s(strValue, 50, "Measure Result(um)"); break; } pChart->yAxis()->setAutoScale(); pChart->yAxis()->setLabelFormat("{value}"); pChart->yAxis()->setTitle(strValue, "arialbd.ttf", 9); pChart->yAxis()->setWidth(nLineWidthY); pChart->xAxis()->setAutoScale(); pChart->xAxis()->setTitle("Glass ID", "arialbd.ttf", 9); pChart->xAxis()->setDateScale(0, MAX_GLASS_COUNT); pChart->xAxis()->setLabelStep(5); pChart->xAxis()->setWidth(nLineWidthX); // Draw GlassID X Axis //pChart->xAxis()->setLabelStep(1, 0); pChart->xAxis()->setLabels(StringArray(m_szGlassID, MAX_GLASS_COUNT))->setFontAngle(60); pChart->xAxis()->setTitle("Glass ID", "arialbi.ttf", 9); } void CChartGlassData::DrawResultData(int nMode, XYChart *pChart, int nType) { int nStartIndex = 0; if(nType) nStartIndex = 1; else nStartIndex = 0; for (int i = nStartIndex; i < m_nResultCount; i+=2) { // Add a line layer to the chart LineLayer *layer = pChart->addLineLayer(); // Add the first line. Plot the points with a 7 pixel square symbol layer->addDataSet( DoubleArray(m_dResultValue2[i], MAX_GLASS_COUNT), m_nResultColor[i], m_szResultName[i])->setDataSymbol(m_nResultSymbol[i], 5); } }