// CombineDlg.cpp : implementation file // #include "stdafx.h" #include "geomative.h" #include "CombineDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern int g_iUILanguage; extern void SplitterString(CStringArray &szArray,const CString& szSource, const CString& szSplitter); ///////////////////////////////////////////////////////////////////////////// // CCombineDlg dialog // CCombineDlg::CCombineDlg(CWnd* pParent /*=NULL*/) // : CDialog(CCombineDlg::IDD, pParent) // { // //{{AFX_DATA_INIT(CCombineDlg) // // NOTE: the ClassWizard will add member initialization here // //}}AFX_DATA_INIT // } CCombineDlg::CCombineDlg(CNavDataView *pNavData,CHandleProcessor HandleProcessor,_ConnectionPtr connectPtr, CWnd* pParent /*=NULL*/) : CDialog(CCombineDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCombineDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_pNavData = pNavData; m_handleProcessor = HandleProcessor; m_connectPtr = connectPtr; m_fCombiXDistance = 0; m_fCombiYDistance = 0; m_nCombiXGridSize = 0; m_nCOmbiYGridSize = 0; } void CCombineDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCombineDlg) DDX_Control(pDX, IDC_TASK_LIST, m_TaskList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCombineDlg, CDialog) //{{AFX_MSG_MAP(CCombineDlg) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCombineDlg message handlers void CCombineDlg::OnOK() { // TODO: Add extra validation here //检索有几个测试任务被选中 m_nSum = m_nID = 0; //m_nSum:记录选中多少个任务 m_nID:记录_Task对象中当前存了多少个对象 for (int n = 0; n < m_TaskList.GetItemCount(); n++) { if (m_TaskList.GetCheck(n) == TRUE) m_nSum++; } if (m_nSum < 2)//小于两个选中项无法合并 return; //申请空间 m_pTask = NULL; m_pTask = new _task[m_nSum]; if (!m_pTask) return; //判断选中项是否有效 if (!CheckTaskValid()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("任务不能合并")); else MessageBoxEx(NULL, _T("Task can not combine"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); goto _exit; } //将测试任务信息插入到数据库中 InsertTdInfoToDB(); //将数据主体插入数据库中 InsertDataToDB(); _exit: delete []m_pTask; m_pTask = NULL; CDialog::OnOK(); } BOOL CCombineDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_TaskList.SetExtendedStyle(m_TaskList.GetExtendedStyle()|LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); int ColumnCount = m_TaskList.GetHeaderCtrl()->GetItemCount(); for (int n = 0; n < ColumnCount; n++) { m_TaskList.DeleteColumn(0); } m_TaskList.InsertColumn(0, "Name", 70,130); m_TaskList.InsertColumn(1, "Test Type", 70,100); m_TaskList.InsertColumn(2, "Rect(X0,Y0)", 70,100); // m_TaskList.InsertColumn(3, "Rect(X1,Y1)", 70,100); m_TaskList.InsertColumn(3, "Local(X0,Y0)", 70,100); // m_TaskList.InsertColumn(5, "Local(X1,Y1)", 70,100); m_TaskList.InsertColumn(4, "Distance(X,Y)", 70,130); m_TaskList.InsertColumn(5, "Step(X,Y)", 70,100); //从数据库里面取出数据初始化界面 InitListContent(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CCombineDlg::InitListContent() { HTREEITEM hTzItem = NULL; _RecordsetPtr pRecTzID = NULL; DWORD dwHandle = (DWORD)VAL_ZERO; DWORD dwID = (DWORD)VAL_ZERO; DWORD dwTdID = (DWORD)VAL_ZERO; CString szSql = _T(""); hTzItem = m_pNavData->m_dataTree.GetSelectedItem(); dwHandle = m_pNavData->m_dataTree.GetItemData(hTzItem); m_TzID = m_handleProcessor.GetIDFromHandle(dwHandle); pRecTzID.CreateInstance(_uuidof(Recordset)); try { //这里要判断3d任务才显示出来 szSql.Empty(); szSql.Format(_T("select ID,TDname,Ttype,rect,rect_loc,Edistance,Espace from td where TZID = %u"), m_TzID); pRecTzID->Open(szSql.AllocSysString(), _variant_t((IDispatch*)m_connectPtr, true), adOpenStatic, adLockOptimistic, adCmdText); int id = 0; //need_repair,ERROR,取值错误的问题 while ((short)VAL_ZERO == pRecTzID->adoEOF) { //取出测试任务 m_TaskList.InsertItem(id,(LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("TDname"))); //判断测试任务类型(1d,2d,3d) switch (pRecTzID->GetCollect(_T("Ttype")).iVal) { case 0: m_TaskList.SetItemText(id, 1, "1D"); break; case 1: m_TaskList.SetItemText(id, 1, "2D"); break; case 2: m_TaskList.SetItemText(id, 1, "3D"); break; default: m_TaskList.SetItemText(id, 1, "unKnow"); break; } //取出矩阵大小 m_TaskList.SetItemText(id, 2, (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("rect"))); //取出矩阵坐标 m_TaskList.SetItemText(id, 3, (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("rect_loc"))); //取出电极间距 m_TaskList.SetItemText(id, 4, (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Edistance"))); //取出电极步长 m_TaskList.SetItemText(id, 5, (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Espace"))); //将测试任务ID和列表绑定 m_TaskList.SetItemData(id, pRecTzID->GetCollect(_T("ID")).iVal); pRecTzID->MoveNext(); id++; } pRecTzID->Close(); } catch (_com_error e) { AfxMessageBox(e.Description()); } } BOOL CCombineDlg::CheckTaskValid() { CString szFirstDistance = _T("");//第一个被选中记录的电极间距 CString szFirstStep = _T("");//第一个被选中记录的电极间隔 BOOL bSig = TRUE;//一个标记位,当szFirstDistance和szStep被赋值时,FALSE CString szTmpOne = _T("");//临时保存数据的变量 CString szTmpTwo = _T("");//同上 CString szTestType = _T(""); int id = 0; //判断选择测试任务合并的有效性 for (int i = 0; i < m_TaskList.GetItemCount(); i++) { if (m_TaskList.GetCheck(i) == TRUE) { //将数据放入到_task结构体中 InsertTask(m_TaskList.GetItemData(i)); if (bSig)//将第一条记录的信息保存起来 { szFirstDistance = m_TaskList.GetItemText(i, 4); szFirstStep = m_TaskList.GetItemText(i, 4); bSig = FALSE; continue;//继续查找下面被选中的记录 } //将第一条被选中的记录,与后面被选中的记录作比较,不相当,则为不符合合并的条件 szTmpOne = m_TaskList.GetItemText(i, 4); szTmpTwo = m_TaskList.GetItemText(i, 5); szTestType = m_TaskList.GetItemText(i, 1); //步长间距不相等则不符合合并要求,目前仅支持3D测试任务合并 // if (szFirstDistance != szTmpOne || szFirstStep != szTmpTwo || szTestType != "3D") // return FALSE; } } return TRUE; } BOOL CCombineDlg::InsertTdInfoToDB() { CString szCN = _T(""); CString szSql = _T(""); CString szCn = _T(""); int nTpAmount = 0; _CommandPtr pCmdIns = NULL; _RecordsetPtr pRecTdID = NULL; pCmdIns.CreateInstance(_uuidof(Command)); pRecTdID.CreateInstance(_uuidof(Recordset)); pCmdIns->ActiveConnection = m_connectPtr; szCN = this->m_guCodeCreator.GenerateGUIDCode(); m_szTaskName = GetTaskName();//取得任务名字 szCN = GetTdCN(m_pTask[0].m_szTdCN);//取得任务CN号 nTpAmount = GetTpAmount();//取得测点数 m_scriptType = m_pTask[0].m_iSType; m_testType = m_pTask[0].m_iTType; try { szSql.Empty(); szSql.Format(_T("insert into td(TDname,TDCN,Tlocation,DEID,DESN,TZID,SCID,SCCN,Sname,Stype,Ttype,Tmode,Eamount,TPamount,CHamount,N,TRwave,TRfrequency,Ifrequency," "SAfrequency,Clayout,Espace,Edistance,weather,WDIR,temperature,height,humidity,Cdate,Ctime,Tdate,Ttime,Rdirection,CRtime,PM,OP,QA,rect,rect_loc) " "values('%s','%s','%s',%u,'%s',%u,%u,'%s','%s',%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s','%s',%d,%d,%.2f,%.2f,%.2f,#%s#,#%s#,#%s#,#%s#,%d,%d,'%s','%s','%s','%s','%s')"), m_szTaskName,//名字 szCN, m_pTask[0].m_szTLocation, //矩形位置 m_pTask[0].m_deviceID, m_pTask[0].m_SN, m_TzID, m_pTask[0].m_szSCID, m_pTask[0].m_szSCCN, m_pTask[0].m_szSName, m_pTask[0].m_iSType, m_pTask[0].m_iTType, m_pTask[0].m_iTMode, m_pTask[0].m_iEAmount,//可能需要修改 nTpAmount,//可能需要修改 m_pTask[0].m_ChNumber, m_pTask[0].m_iN, m_pTask[0].m_iTRWave, m_pTask[0].m_iTRFrequency, m_pTask[0].m_iIFrequency, m_pTask[0].m_iSAFrequency, m_pTask[0].m_iCLayout, m_pTask[0].m_fESpace, m_pTask[0].m_iEDistance, m_pTask[0].m_iWeather, m_pTask[0].m_iWDIR, m_pTask[0].m_fTemperature, m_pTask[0].m_fHeight, m_pTask[0].m_fHumidity, m_pTask[0].m_szCDate, m_pTask[0].m_szCTime, m_pTask[0].m_szTDate, m_pTask[0].m_szTTime, m_pTask[0].m_iRDirection, m_pTask[0].m_CRtime, " ",//PM " ",//OP " ",//QA m_pTask[0].m_Rect,//可能需要修改 m_pTask[0].m_RectLocal);//可能需要修改 // AfxMessageBox(szSql); // FILE *pFile = NULL; // pFile = fopen("Log//lll.txt", "ab+"); // fwrite(szSql.GetBuffer(0), 1, szSql.GetLength(), pFile); // fflush(pFile); // fclose(pFile); pCmdIns->CommandText = szSql.AllocSysString(); pCmdIns->Execute(NULL, NULL, adCmdText); //获取刚才插入任务的ID pRecTdID->Open(_T("select max(ID) as ID from td"), _variant_t((IDispatch*)m_connectPtr, true), adOpenStatic, adLockOptimistic, adCmdText); m_TdID = pRecTdID->GetCollect(_T("ID")).ulVal; pRecTdID->Close(); //将记录插入到Tdchannel中 szSql.Empty(); szSql.Format("insert into tdchannel(TDID,CHnumber,AR) values(%u,%d,%d)", m_TdID, m_pTask[0].m_ChNumber, m_pTask[0].m_AR); pCmdIns->CommandText = szSql.AllocSysString(); pCmdIns->Execute(NULL, NULL, adCmdText); //获取刚才插入任务的ID pRecTdID->Open(_T("select max(ID) as ID from tdchannel"), _variant_t((IDispatch*)m_connectPtr, true), adOpenStatic, adLockOptimistic, adCmdText); m_tchID = pRecTdID->GetCollect(_T("ID")).ulVal; pRecTdID->Close(); } catch(_com_error* e) { AfxMessageBox((LPCTSTR)e->Description()); } return FALSE; } void CCombineDlg::InsertTask(DWORD dwID) { //函数将数据库中取出的数据全部保存到_Task结构体中 if (m_nID >= m_nSum) { return;//超出了申请内存的最大值 } try { _RecordsetPtr pRecTzID = NULL; CString szSql = _T(""); pRecTzID.CreateInstance(_uuidof(Recordset)); szSql.Empty(); szSql.Format(_T("select * from td where ID = %u"), dwID); pRecTzID->Open(szSql.AllocSysString(), _variant_t((IDispatch*)m_connectPtr, true), adOpenStatic, adLockOptimistic, adCmdText); m_pTask[m_nID].m_szTdName = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("TDname")); m_pTask[m_nID].m_szTdCN = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("TDCN")); m_pTask[m_nID].m_szTLocation = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Tlocation")); m_pTask[m_nID].m_deviceID = pRecTzID->GetCollect(_T("DEID")).iVal; m_pTask[m_nID].m_SN = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("DESN")); m_pTask[m_nID].m_TzId = pRecTzID->GetCollect(_T("TZID")).iVal; m_pTask[m_nID].m_szSCID = pRecTzID->GetCollect(_T("SCID")).iVal; m_pTask[m_nID].m_szSCCN = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("SCCN")); m_pTask[m_nID].m_szSName = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Sname")); m_pTask[m_nID].m_iSType = pRecTzID->GetCollect(_T("Stype")).iVal; m_pTask[m_nID].m_iTType = pRecTzID->GetCollect(_T("Ttype")).iVal; m_pTask[m_nID].m_iTMode = pRecTzID->GetCollect(_T("Tmode")).iVal; m_pTask[m_nID].m_iEAmount = pRecTzID->GetCollect(_T("Eamount")).iVal; m_pTask[m_nID].m_iTPAmount = pRecTzID->GetCollect(_T("TPamount")).iVal; m_pTask[m_nID].m_iCHAmount = pRecTzID->GetCollect(_T("CHamount")).iVal; m_pTask[m_nID].m_iN = pRecTzID->GetCollect(_T("N")).iVal; m_pTask[m_nID].m_iTRWave = pRecTzID->GetCollect(_T("TRwave")).iVal; m_pTask[m_nID].m_iTRFrequency = pRecTzID->GetCollect(_T("TRfrequency")).iVal; m_pTask[m_nID].m_iIFrequency = pRecTzID->GetCollect(_T("Ifrequency")).iVal; m_pTask[m_nID].m_iSAFrequency = pRecTzID->GetCollect(_T("SAfrequency")).iVal; m_pTask[m_nID].m_iCLayout = pRecTzID->GetCollect(_T("Clayout")).iVal; m_pTask[m_nID].m_fESpace = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Espace")); m_pTask[m_nID].m_iEDistance = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Edistance")); m_pTask[m_nID].m_iWeather = pRecTzID->GetCollect(_T("weather")).iVal; m_pTask[m_nID].m_iWDIR = pRecTzID->GetCollect(_T("WDIR")).iVal; m_pTask[m_nID].m_fTemperature = pRecTzID->GetCollect(_T("temperature")).fltVal; m_pTask[m_nID].m_fHeight = pRecTzID->GetCollect(_T("height")).fltVal; m_pTask[m_nID].m_fHeight = pRecTzID->GetCollect(_T("humidity")).fltVal; m_pTask[m_nID].m_szCDate = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Cdate")); m_pTask[m_nID].m_szCTime = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Ctime")); m_pTask[m_nID].m_szTDate = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Tdate")); m_pTask[m_nID].m_szTTime = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("Ttime")); m_pTask[m_nID].m_iRDirection = pRecTzID->GetCollect(_T("Rdirection")).iVal; m_pTask[m_nID].m_CRtime = pRecTzID->GetCollect(_T("CRtime")).iVal; // m_pTask[m_nID].m_szPM = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("PM")); // m_pTask[m_nID].m_szOP = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("OP")); // m_pTask[m_nID].m_szQA = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("QA")); m_pTask[m_nID].m_Rect = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("rect")); m_pTask[m_nID].m_RectLocal = (LPCTSTR)(_bstr_t)pRecTzID->GetCollect(_T("rect_loc")); pRecTzID->Close(); //取通道信息 szSql.Empty(); szSql.Format(_T("select * from tdchannel where TDID = %u"), dwID); pRecTzID->Open(szSql.AllocSysString(), _variant_t((IDispatch*)m_connectPtr, true), adOpenStatic, adLockOptimistic, adCmdText); m_pTask[m_nID].m_TCHID = pRecTzID->GetCollect(_T("ID")).iVal; m_pTask[m_nID].m_ChNumber = pRecTzID->GetCollect(_T("CHnumber")).iVal; m_pTask[m_nID].m_AR = pRecTzID->GetCollect(_T("AR")).iVal; pRecTzID->Close(); m_nID++; } catch(_com_error e) { AfxMessageBox((LPCTSTR)e.Description()); } } _task::_task() { m_szTdName = _T(""); //测试任务名字 m_szTdCN = _T(""); //测试任务唯一ID m_szTLocation = _T(""); //任务位置 m_deviceID = 0; //设备ID m_SN = _T(""); //设备序列号 m_iTType = 0; //测试类型 1d,2d,3d m_iTMode = 0; //测试模式 RES,IP,SP m_iEAmount = 0; //电极数量 m_iTPAmount = 0; //测点数量 m_iCHAmount = 0; //通道数量 m_iN = 0; //迭代次数 m_iTRWave = 0; //发射波形 m_iTRFrequency = 0; //发射频率 m_iIFrequency = 0; //工业披绿 m_iSAFrequency = 0; //采样频率 m_iCLayout = 0; //电缆布置方式 m_fESpace = _T(""); //电极间隔 m_iEDistance = _T("");//电极间距 m_iWeather = 0; //天气 m_iWDIR = 0; //风向 m_fTemperature = 0;//温度 m_fHeight = 0; //海拔 m_fHumidity = 0; //湿度 m_szCDate = _T(""); //建立日期 m_szCTime = _T(""); //建立时间 m_szTDate = _T(""); //测试日期 m_szTTime = _T(""); //测试时间 m_iRDirection = 0; //滚动方向 // m_szPM = _T(""); //项目经理 // m_szOP = _T(""); //操作员 // m_szQA = _T(""); //质检员 m_Rect = _T(""); //矩阵大小 m_RectLocal = _T("");//矩阵位置 } _task::~_task() { } BOOL CCombineDlg::InsertDataToDB() { CString szSql = _T(""); _CommandPtr pCmdIns; pCmdIns.CreateInstance(_uuidof(Command)); pCmdIns->ActiveConnection = m_connectPtr; for (int n = 0; n < m_nSum; n++) { try { szSql.Empty(); szSql.Format("insert into td3dcon(TCHID,TSN,C1,C2,P1,P2,N,K,I,V,R0,SP,bUse,Vrawdata,Irawdata) select %d,TSN,C1,C2,P1,P2,N,K,I,V,R0,SP,bUse,Vrawdata,Irawdata from td3dcon where TCHID = %d",m_tchID, m_pTask[n].m_TCHID); pCmdIns->CommandText = szSql.AllocSysString(); pCmdIns->Execute(NULL, NULL, adCmdText); } catch(_com_error* e) { AfxMessageBox((LPCTSTR)e->Description()); } } return FALSE; } CString CCombineDlg::GetTaskName() { CString szName = _T(""); for (int n = 0; n < m_nSum; n++) { szName = szName + m_pTask[n].m_szTdName + "-"; } szName = szName.Left(szName.GetLength() - 1); return szName; } CString CCombineDlg::GetTdCN(CString f_CN) { CString szHeader = _T(""); szHeader = f_CN.Left(4);//取出测试任务头部的测试类型 CTime time; time = CTime::GetCurrentTime(); szHeader = szHeader + time.FormatGmt(_T("%Y%m%d"))+time.FormatGmt(_T("%H%M%S")); return szHeader; } int CCombineDlg::GetTpAmount() { int nCount = 0;//计算测点总数 for (int n = 0; n < m_nSum; n++) { nCount += m_pTask[n].m_iTPAmount; } return nCount; } BOOL CCombineDlg::CalcCombineRectAndEDistance() { if (NULL == m_pTask) { return FALSE; } std::vector nXInfo; std::vector nYInfo; float fMinXVal = 0, fMaxXVal = 0; float fMinYVal = 0, fMaxYVal = 0; int nTotalXGridCnt = 0, nTotalYGridCnt = 0; CStringArray strArray; CString strErr; for (int i = 0; i < m_nSum; i++) { strArray.RemoveAll(); SplitterString(strArray, m_pTask[i].m_RectLocal, ","); if (2 > strArray.GetSize()) { return FALSE; } //获取最小的X,Y位置,将各个任务的起始点的X,Y来作为对比 float fXLoc = atof(strArray.GetAt(0)); float fYLoc = atof(strArray.GetAt(1)); if (fMinXVal > fXLoc) { fMinXVal = fXLoc; } if (fMinYVal > fYLoc) { fMinYVal = fYLoc; } float fXEDis = 0, fYEDis = 0; strArray.RemoveAll(); //在这里,如果存在着 ",1" 这种字符串,则会将1赋给XEDistance SplitterString(strArray, m_pTask[i].m_iEDistance, ","); if (0 == strArray.GetSize()) { return FALSE; } //获取X,Y轴的电极间距 if (strArray.GetSize() > 1) { fYEDis = atof(strArray.GetAt(1)); } fXEDis = atof(strArray.GetAt(0)); //获取网格的大小 strArray.RemoveAll(); SplitterString(strArray, m_pTask[i].m_Rect, ","); if (4 != strArray.GetSize()) { return FALSE; } int nXGridSize = atoi(strArray[2]) - atoi(strArray[0]) + 1; int nYGridSize = atoi(strArray[3]) - atoi(strArray[1]) + 1; nTotalXGridCnt += nXGridSize; nTotalYGridCnt += nYGridSize; fXLoc += fXEDis*(nXGridSize - 1); fYLoc += fYEDis*(nYGridSize - 1); //获取最大的X,Y轴的位置 if (fXLoc > fMaxXVal) { fMaxXVal = fXLoc; } if (fYLoc > fMaxYVal) { fMaxYVal = fYLoc; } } if (nTotalXGridCnt > 1) { m_fCombiXDistance = (fMaxXVal - fMinXVal)/(nTotalXGridCnt - 1); } else { } if (nTotalYGridCnt > 1) { m_fCombiYDistance = (fMaxYVal - fMinYVal)/(nTotalYGridCnt - 1); } m_nCombiXGridSize = nTotalXGridCnt; m_nCOmbiYGridSize = nTotalYGridCnt; return TRUE; }