// DialCreateNew3DSpt.cpp : implementation file // #include "stdafx.h" #include "geomative.h" #include "DialCreateNew3DSpt.h" #include "Script3D.h" #include "Medium3D.h" #include "CDialog3DScriptDrawingBoard.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define MAX_GRID_SIZE 100 #define MAX_POLE_DISTANCE 100000 #define MAX_ITERATION_NUMBER 255 const float EPSINON = 0.00001; ///////////////////////////////////////////////////////////////////////////// // CDialCreateNew3DSpt dialog extern bool IsExistSpecialChar(const CString &strFileName); extern HHOOK hHook; extern LRESULT __stdcall CBTHookProc(long nCode, WPARAM wParam, LPARAM lParam); extern bool bIsInteger(CString strTxt); extern bool bIsFloat(CString strTxt); extern void SplitterString(CStringArray &szArray,const CString& szSource, const CString& szSplitter); extern int g_iUILanguage; extern CGeoMativeApp theApp; CDialCreateNew3DSpt::CDialCreateNew3DSpt(CScript3D* pNewScript, CLinkList* pMedLinkList, INT_PTR* pRet, CWnd* pParent /*=NULL*/) : CDialog(CDialCreateNew3DSpt::IDD, pParent) { //{{AFX_DATA_INIT(CDialCreateNew3DSpt) m_strSptName = _T(""); m_strSptOperator = _T(""); m_strSptRemark = _T(""); m_strStacking = _T(""); m_strGridXSize = _T(""); m_strGridYSize = _T(""); m_uiXGridSize = 0; m_uiYGridSize = 0; m_fXPoleDistance = 0.0f; m_fYPoleDistance = 0.0f; m_uiIterationNumber = 0; m_iSptArray = -1; m_iSptRunMethod = -1; //}}AFX_DATA_INIT m_pNewScript = pNewScript; m_pMedLinkList = pMedLinkList; m_uiStepX = m_uiStepY = 1; m_iSplitSptNum = 1; m_strRect =_T(""); m_strPoleStart = _T(""); m_strPoleStep = _T(""); m_strPoleDistance = _T(""); m_fABSpace = 0; m_fAPosX = 0; m_fAPosY = 0; m_CreateDate = CTime::GetCurrentTime(); } void CDialCreateNew3DSpt::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDialCreateNew3DSpt) DDX_Control(pDX, IDC_EDIT_3D_SPT_MIN_AM_SPACE, m_fEditMinAMSpace); DDX_Control(pDX, IDC_EDIT_3D_SPT_AB_DISTANCE, m_fEditABSpace); DDX_Control(pDX, IDC_3D_SPT_DATETIMEPICKER, m_ctrlDateTime); DDX_Control(pDX, IDC_COMBO_3D_SPT_MEASURE_METHOD, m_cmbSptRunMethod); DDX_Control(pDX, IDC_COMBO_3D_SPT_ARRAY, m_cmdSptArray); DDX_Text(pDX, IDC_EDIT_3D_SPT_NAME, m_strSptName); DDX_Text(pDX, IDC_EDIT_3D_SPT_OPERATOR, m_strSptOperator); DDX_Text(pDX, IDC_EDIT_3D_SPT_REMARK, m_strSptRemark); DDX_Text(pDX, IDC_EDIT_3D_SPT_ITERATION_NUMBER, m_strStacking); DDX_Text(pDX, IDC_EDIT_3D_SPT_X_GRID_SIZE, m_strGridXSize); DDX_Text(pDX, IDC_EDIT_3D_SPT_Y_GRID_SIZE, m_strGridYSize); // DDX_Text(pDX, IDC_EDIT_3D_SPT_X_POLE_DISTANCE, m_strXPoleSpace); // DDX_Text(pDX, IDC_EDIT_3D_SPT_X_POLE_DISTANCE, m_strYPoleSpace); DDX_Control(pDX, IDC_EDIT_3D_SPT_X_POLE_DISTANCE, m_fEditXPoleSpace); DDX_Control(pDX, IDC_EDIT_3D_SPT_Y_POLE_DISTANCE, m_fEditYPoleSpace); //}}AFX_DATA_MAP DDX_Control(pDX, IDC_COMBO_3D_SPT_CABLE_DIRECTION, m_comCableDirection); } BEGIN_MESSAGE_MAP(CDialCreateNew3DSpt, CDialog) //{{AFX_MSG_MAP(CDialCreateNew3DSpt) //ON_WM_PAINT() ON_CBN_SELCHANGE(IDC_COMBO_3D_SPT_MEASURE_METHOD, OnSelchangeCombo3dSptMeasureMethod) ON_CBN_SELCHANGE(IDC_COMBO_3D_SPT_ARRAY, OnSelchangeCombo3dSptArray) ON_WM_CREATE() //}}AFX_MSG_MAP ON_CBN_SELCHANGE(IDC_COMBO_3D_SPT_CABLE_DIRECTION, &CDialCreateNew3DSpt::OnCbnSelchangeCombo3dSptCableDirection) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDialCreateNew3DSpt message handlers /*void CDialCreateNew3DSpt::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CRect rect; GetDlgItem(IDC_STATIC_PICTURE)->GetWindowRect(&rect); ScreenToClient(&rect); ////////////////////////////////////////////////////////////////////////// CDC dcMem; dcMem.CreateCompatibleDC(&dc); CString str; int iRunArray = m_cmdSptArray.GetItemData(m_cmdSptArray.GetCurSel()); int iRunMethod = m_cmbSptRunMethod.GetItemData(m_cmbSptRunMethod.GetCurSel()); WORD wResourceID = 0; switch (iRunMethod) { case EN_3D_SPT_FULL_MEASURE: //str = ".\\res\\full-measurement.bmp";//img path //在这里只有单极-单极才会有全测量 wResourceID = IDB_P2P_FULL_MEASUREMENT1; break; case EN_3D_SPT_CROSS_DIAGONAL: //str = ".\\res\\cross-diagonal.bmp";//img path if (EN_3D_SPT_POLE_POLE == iRunArray) wResourceID = IDB_P2P_CROSS_DIAGONAL_MEASUREMENT1; else wResourceID = IDB_CROSS_DIAGONAL1; break; case EN_3D_SPT_CROSS_MEASURE: //str = ".\\res\\cross-measurement.bmp";//img path if (EN_3D_SPT_POLE_POLE == iRunArray) wResourceID = IDB_P2P_CROSS_MEASUREMENT1; else wResourceID = IDB_CROSS_MEASURE1; break; default: //str = ".\\res\\default_measure.bmp";//img path wResourceID = IDB_DEFAULT_MEASURE1; break; } if (EN_3D_SPT_MID_GARDIENT == iRunArray) { wResourceID = IDB_DEFAULT_MEASURE1; } // HBITMAP createBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), str, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); //MAKEINTRESOURCE的函数是将资源ID转换为字符串的资源参数 HBITMAP createBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(wResourceID), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE); BITMAP bitmap; CBitmap bmp; bmp.Attach(createBitmap);//HBitmap to CBitmap bmp.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmp); dc.StretchBlt(rect.left-1,rect.top-1,rect.Width(),rect.Height(),&dcMem,0,0, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY); ////////////////////////////////////////////////////////////////////////// // Do not call CDialog::OnPaint() for painting messages }*/ BOOL CDialCreateNew3DSpt::Create(UINT nID, CWnd* pParentWnd) { // TODO: Add your specialized code here and/or call the base class pParentWnd->EnableWindow(FALSE); return CDialog::Create(IDD, pParentWnd); } BOOL CDialCreateNew3DSpt::OnInitDialog() { CDialog::OnInitDialog(); //将界面上的显示为中文 if (LANG_ZHCN == g_iUILanguage) { GetDlgItem(IDC_STATIC_BASIC_INFORMATION)->SetWindowText(_T("基本信息")); GetDlgItem(IDC_STATIC_SPT_NAME)->SetWindowText(_T("脚本名称")); GetDlgItem(IDC_STATIC_SPT_DATE)->SetWindowText(_T("日期")); GetDlgItem(IDC_STATIC_SPT_REMARK)->SetWindowText(_T("备注")); GetDlgItem(IDC_STATIC_SPT_OPERATOR)->SetWindowText(_T("操作员")); GetDlgItem(IDC_STATIC_3D_SPT_SHOW)->SetWindowText(_T("脚本信息")); GetDlgItem(IDC_STATIC_SPT_ARRAY)->SetWindowText(_T("装置")); GetDlgItem(IDC_STATIC_SPT_RUN)->SetWindowText(_T("测量方法")); GetDlgItem(IDC_STATIC_POLE_DISTANCE)->SetWindowText(_T("电极间距")); GetDlgItem(IDC_STATIC_SPT_X_POLE_DISTANCE)->SetWindowText(_T("X轴电极间距")); GetDlgItem(IDC_STATIC_SPT_Y_POLE_DISTANCE)->SetWindowText(_T("Y轴电极间距")); GetDlgItem(IDC_STATIC_GRID_INFO)->SetWindowText(_T("网格信息")); GetDlgItem(IDC_STATIC_SPT_X_GRID_SIZE)->SetWindowText(_T("X轴网格大小")); GetDlgItem(IDC_STATIC_SPT_Y_GRID_SIZE)->SetWindowText(_T("Y轴网格大小")); GetDlgItem(IDC_STATIC_SPT_X_GRID_OFFSET)->SetWindowText(_T("X轴网格偏移")); GetDlgItem(IDC_STATIC_SPT_Y_GRID_OFFSET)->SetWindowText(_T("Y轴网格偏移")); GetDlgItem(IDC_STATIC_SPT_ITER_NUMBER)->SetWindowText(_T("迭代数")); GetDlgItem(IDC_STATIC_SPT_CABLE_DIRECTION)->SetWindowText(_T("电缆方向")); GetDlgItem(IDOK)->SetWindowText(_T("确定")); GetDlgItem(IDCANCEL)->SetWindowText(_T("取消")); SetWindowText(_T("3D脚本")); } // TODO: Add extra initialization here m_cmdSptArray.ResetContent(); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("Pole-Pole"), EN_3D_SPT_POLE_POLE); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("Pole-Dipole"), EN_3D_SPT_POLE_DIPOLE); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("Dipole-Dipole"), EN_3D_SPT_DIPOLE_DIPOLE); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("Schlumberger"), EN_3D_SPT_SCHLUMBERGER); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("WennerAlfa"), EN_3D_SPT_WENNER_ALFA); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("WennerBeta"), EN_3D_SPT_WENNER_BETA); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("Mid-Gradient-Scan"),EN_3D_SPT_MID_GARDIENT); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("landfill1"), EN_3D_SPT_LAND_FILL_ONE); m_cmdSptArray.SetItemData(m_cmdSptArray.AddString("landfill2"), EN_3D_SPT_LAND_FILL_TWO); m_comCableDirection.AddString("X"); m_comCableDirection.AddString("Y"); m_cmbSptRunMethod.ResetContent(); m_cmdSptArray.SetCurSel(-1); m_cmbSptRunMethod.SetCurSel(-1); GetDlgItem(IDC_EDIT_3D_SPT_X_GRID_OFFSET)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_3D_SPT_Y_GRID_OFFSET)->EnableWindow(FALSE); ((CEdit*)GetDlgItem(IDC_EDIT_3D_SPT_NAME))->SetLimitText(20); ((CEdit*)GetDlgItem(IDC_EDIT_3D_SPT_REMARK))->SetLimitText(50); ((CEdit*)GetDlgItem(IDC_EDIT_3D_SPT_OPERATOR))->SetLimitText(10); CChannel* pChannel = new CChannel; pChannel->m_iChNumber = (int)VAL_ONE; m_pNewScript->m_chaList.AddTail((void*)pChannel); GetDlgItem(IDC_EDIT_3D_SPT_NAME)->SetFocus(); m_strGridXSize = _T("0"); m_strGridYSize = _T("0"); m_fEditXPoleSpace.SetIntLimitLen(5); m_fEditXPoleSpace.SetDecLimitLen(2); m_fEditYPoleSpace.SetIntLimitLen(5); m_fEditYPoleSpace.SetDecLimitLen(2); m_fEditXPoleSpace.SetWindowText(_T("0")); m_fEditYPoleSpace.SetWindowText(_T("0")); m_fEditABSpace.SetIntLimitLen(5); m_fEditABSpace.SetDecLimitLen(2); m_fEditABSpace.SetWindowText("0"); m_fEditMinAMSpace.SetWindowText(_T("0")); GetDlgItem(IDC_EDIT_3D_SPT_A_POS)->SetWindowText(_T("0,0")); GetDlgItem(IDC_EDIT_3D_SPT_AB_DISTANCE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_3D_SPT_A_POS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC_SPT_MIN_AB_SPACE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_3D_SPT_MIN_AM_SPACE)->ShowWindow(SW_HIDE); m_strStacking = _T("1"); m_uiIterationNumber = 1; m_fXPoleDistance = 0; m_fYPoleDistance = 0; m_iSplitSptNum = 1; UpdateData(FALSE); CRect rcDrawCtr; GetDlgItem(IDC_STATIC_PICTURE)->GetClientRect(&rcDrawCtr); //m_DrawingBoardDlg.Create(IDD_DIALOG_DRAWING_BOARD, this); rcDrawCtr.left = rcDrawCtr.left + 1; rcDrawCtr.right = rcDrawCtr.right - 1; rcDrawCtr.top = rcDrawCtr.top + 1; rcDrawCtr.bottom = rcDrawCtr.bottom - 1; CDialog3DScriptDrawingBoard::GetInstance()->Create(IDD_DIALOG_3D_SCRIPT_DRAWING_BOARD, GetDlgItem(IDC_STATIC_PICTURE)); CDialog3DScriptDrawingBoard::GetInstance()->MoveWindow(&rcDrawCtr); CDialog3DScriptDrawingBoard::GetInstance()->ShowWindow(SW_SHOW); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDialCreateNew3DSpt::OnSelchangeCombo3dSptMeasureMethod() { // TODO: Add your control notification handler code here // if (m_iSptRunMethod != m_cmbSptRunMethod.GetCurSel()) // { // m_iSptRunMethod = m_cmbSptRunMethod.GetCurSel(); // Invalidate(); // } } bool CDialCreateNew3DSpt::CheckValueValid() { hHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTHookProc,AfxGetInstanceHandle(),NULL); if (!UpdateData(TRUE)) { return false; } // CString strGridX = GetDlgItem(IDC_EDIT_3D_SPT_X_GRID_SIZE)->GetWindowText() // if (!bIsFloat(m_strXPoleSpace)) // { // AfxMessageBox(_T("Please input an float value on X Pole Distance")); // return false; // } // // if (!bIsFloat(m_strYPoleSpace)) // { // AfxMessageBox(_T("Please input an float value on Y Pole Distance")); // return false; // } if (!bIsInteger(m_strGridXSize)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("X轴网格大小须为正整数.")); else MessageBoxEx(NULL, _T("Please input an integer on X Grid Size"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (!bIsInteger(m_strGridYSize)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("Y轴网格大小须为正整数.")); else MessageBoxEx(NULL, _T("Please input an integer on Y Grid Size"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (!bIsInteger(m_strStacking)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("迭代次数须为正整数.")); else MessageBoxEx(NULL, _T("Please input an integer on Stacking."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CString strTmp = _T(""); m_fEditXPoleSpace.GetWindowText(strTmp); m_fXPoleDistance = atof(strTmp); strTmp.Empty(); m_fEditYPoleSpace.GetWindowText(strTmp); m_fYPoleDistance = atof(strTmp); m_uiXGridSize = atoi(m_strGridXSize); m_uiYGridSize = atoi(m_strGridYSize); m_uiIterationNumber = atoi(m_strStacking); if (IsExistSpecialChar(m_strSptName)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("脚本名称中包含特殊字符,请重新命名.")); else MessageBoxEx(NULL, _T("There are some special charcter in script name,please rename it."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (m_strSptName.IsEmpty()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("请输入脚本名称.")); else MessageBoxEx(NULL, _T("Please input script name."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (m_uiXGridSize < 2 || m_uiXGridSize > MAX_GRID_SIZE) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("X轴网格大小须为2到100之间的整数.")); else MessageBoxEx(NULL, _T("Please input an integer from 2 to 100 on X Grid Size."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if( m_uiYGridSize < 2 || m_uiYGridSize > MAX_GRID_SIZE) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("Y轴网格大小须为2到100之间的整数.")); else MessageBoxEx(NULL, _T("Please input an integer from 2 to 100 on Y Grid Size."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (m_fXPoleDistance <= 0 || m_fXPoleDistance > MAX_POLE_DISTANCE) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("X轴电极间距大于0小于等于100000.")); else MessageBoxEx(NULL, _T("X-axis electrode spacing is greater than 0 and less than or equal to 100,000. "), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if(m_fYPoleDistance <= 0 || m_fYPoleDistance > MAX_POLE_DISTANCE) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("Y轴电极间距最大不能超过100000.")); else MessageBoxEx(NULL, _T("Please input a positive number less than 100000 on Y Pole Distance."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (m_uiIterationNumber < 1 ||m_uiIterationNumber > MAX_ITERATION_NUMBER) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("迭代数错误,请输入一个1到255的正数.")); else MessageBoxEx(NULL, _T("Stacking number input error;please input an integer from 1 to 255."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (-1 == m_cmdSptArray.GetCurSel() || -1 == m_cmbSptRunMethod.GetCurSel()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("请选择脚本类型和测量方法.")); else MessageBoxEx(NULL, _T("Please select script array and measurement method."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } if (-1 == m_comCableDirection.GetCurSel()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("请选择电缆方向.")); else MessageBoxEx(NULL, _T("Please select cable direction."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } //默认X方向,如果是Y方向需要把脚本 // if (m_comCableDirection.GetCurSel() == 0) // { //added by lsq 20161206 //根据印度现场,将电极间距的精度由小数点后1位调整为小数点后2位 m_strPoleDistance.Empty(); m_strPoleDistance.Format("%.2f,%.2f", m_fXPoleDistance, m_fYPoleDistance); m_strPoleStep.Empty(); m_strPoleStep.Format("%d,%d", 1, 1); m_strRect.Empty(); m_strRect.Format("%d,%d,%d,%d", 0, 0, m_uiXGridSize - 1, m_uiYGridSize - 1); /*} //Y方向 else if (m_comCableDirection.GetCurSel() == 1) { m_strPoleDistance.Empty(); m_strPoleDistance.Format("%.2f,%.2f", m_fYPoleDistance, m_fXPoleDistance); m_strPoleStep.Empty(); m_strPoleStep.Format("%d,%d", 1, 1); m_strRect.Empty(); m_strRect.Format("%d,%d,%d,%d", 0, 0, m_uiYGridSize - 1, m_uiXGridSize - 1); //CDialog3DScriptDrawingBoard::GetInstance()->SetCableDirectionType(EN_CABLE_Y_DIRECTION); }*/ m_strPoleStart.Empty(); m_strPoleStart.Format("%.1f,%.1f", 0, 0); m_ctrlDateTime.GetTime(m_CreateDate); int iAR = m_cmdSptArray.GetItemData(m_cmdSptArray.GetCurSel()); if (EN_3D_SPT_MID_GARDIENT == iAR) { // m_fEditMinAMSpace = 8; CString strAB = _T(""); CString strACoordinate = _T(""); GetDlgItem(IDC_EDIT_3D_SPT_AB_DISTANCE)->GetWindowText(strAB); GetDlgItem(IDC_EDIT_3D_SPT_A_POS)->GetWindowText(strACoordinate); m_fABSpace = atof(strAB); if (m_fABSpace <= (m_uiXGridSize-1)*m_fXPoleDistance) { CString strErr = _T(""); if (LANG_ZHCN == g_iUILanguage) { strErr.Format(_T("AB间距需大于%.2f."), (m_uiXGridSize - 1)*m_fXPoleDistance); AfxMessageBox(strErr); } else { strErr.Format(_T("AB Distance must bigger than %.2f."), (m_uiXGridSize - 1)*m_fXPoleDistance); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); } return false; } if (strACoordinate.IsEmpty()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("A点的坐标不能为空")); else MessageBoxEx(NULL, _T("Please input value on A Coordinate"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CStringArray strArrAPos; strArrAPos.RemoveAll(); SplitterString(strArrAPos, strACoordinate, _T(",")); if (strArrAPos.GetSize() != 2) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("A点的坐标输入错误")); else MessageBoxEx(NULL, _T("Input value error on A Coordinate"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_fAPosX = atof(strArrAPos.GetAt(0)); m_fAPosY = atof(strArrAPos.GetAt(1)); int iTestLineIndex = m_fAPosY/m_fYPoleDistance; if (m_fAPosX < 0 || m_fAPosX >10000 || iTestLineIndex < 0 || (iTestLineIndex+1)>m_uiYGridSize) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("A点的坐标输入错误")); else MessageBoxEx(NULL, _T("Input value error on A Coordinate"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } CString strMinAMSpace = _T(""); m_fEditMinAMSpace.GetWindowText(strMinAMSpace); if (strMinAMSpace.IsEmpty()) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("AM的最短距离不能为空")); else MessageBoxEx(NULL, _T("Please input value on Min AM Distance"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } float fMinAM = atof(strMinAMSpace); if (fMinAM <= 0 || ((fMinAM + (m_uiXGridSize-1)*m_fXPoleDistance) >= m_fABSpace)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("AM的最短距离输入错误")); else MessageBoxEx(NULL, _T("Input value error on Min AM Distance"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } //float的精度误差在1e-5;double精度误差在1e-15 //所以要判断一个单精度浮点数:则是if( fabs(f) <= 1e-5); //要判断一个双精度浮点数:则是if( fabs(f) <= 1e-15 ); //若小于,为0,大于,不为0 //AM的最短距离必须是X轴电极间距的整数倍 int iTmp = (int)(fMinAM/m_fXPoleDistance); if ((fabsf(fMinAM - iTmp*m_fXPoleDistance) > EPSINON) && (fabsf(fMinAM - (iTmp+1)*m_fXPoleDistance) > EPSINON)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("AM的最短距离必须是X轴电极间距的整数倍")); else MessageBoxEx(NULL, _T("The value of Min AM Distance must be an Integer multiple of X Pole Distance"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } iTmp = (int)(m_fABSpace/m_fXPoleDistance); if ((fabsf(m_fABSpace - iTmp*m_fXPoleDistance) > EPSINON) && (fabsf(m_fABSpace- (iTmp+1)*m_fXPoleDistance) > EPSINON)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("AB的距离必须是X轴电极间距的整数倍")); else MessageBoxEx(NULL, _T("The value of AB Distance must be an Integer multiple of X Pole Distance"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } } return true; } void CDialCreateNew3DSpt::OnSelchangeCombo3dSptArray() { // TODO: Add your control notification handler code here int iCurSel = m_cmdSptArray.GetCurSel(); m_cmbSptRunMethod.ResetContent(); if (-1 == iCurSel) { return; } else { DWORD dwItemData = m_cmdSptArray.GetItemData(m_cmdSptArray.GetCurSel()); //在这里只有单极-单极才有全测量模式 if ( dwItemData == EN_3D_SPT_POLE_POLE || dwItemData == EN_3D_SPT_MID_GARDIENT) { m_cmbSptRunMethod.SetItemData(m_cmbSptRunMethod.AddString("Full-Measurement"), EN_3D_SPT_FULL_MEASURE); } m_cmbSptRunMethod.SetItemData(m_cmbSptRunMethod.AddString("Cross-Diagonal"), EN_3D_SPT_CROSS_DIAGONAL); m_cmbSptRunMethod.SetItemData(m_cmbSptRunMethod.AddString("Cross-Measurement"), EN_3D_SPT_CROSS_MEASURE); if (dwItemData == EN_3D_SPT_MID_GARDIENT) { m_cmbSptRunMethod.SetCurSel(0); m_cmbSptRunMethod.EnableWindow(FALSE); GetDlgItem(IDC_STATIC_SPT_MIN_AB_SPACE)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT_3D_SPT_A_POS)->ShowWindow(SW_SHOW); m_fEditABSpace.ShowWindow(SW_SHOW); m_fEditMinAMSpace.ShowWindow(SW_SHOW); if (LANG_ZHCN == g_iUILanguage) { GetDlgItem(IDC_STATIC_SPT_Y_GRID_OFFSET)->SetWindowText(_T("AB间距")); GetDlgItem(IDC_STATIC_SPT_X_GRID_OFFSET)->SetWindowText(_T("A点坐标")); GetDlgItem(IDC_STATIC_SPT_MIN_AB_SPACE)->SetWindowText(_T("AM最短距离")); } else { GetDlgItem(IDC_STATIC_SPT_Y_GRID_OFFSET)->SetWindowText(_T("AB Distance")); GetDlgItem(IDC_STATIC_SPT_X_GRID_OFFSET)->SetWindowText(_T("A Coordinate")); GetDlgItem(IDC_STATIC_SPT_MIN_AB_SPACE)->SetWindowText(_T("Min AM Distance")); } GetDlgItem(IDC_EDIT_3D_SPT_X_GRID_OFFSET)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_3D_SPT_X_GRID_OFFSET)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT_3D_SPT_Y_GRID_OFFSET)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_3D_SPT_Y_GRID_OFFSET)->ShowWindow(SW_HIDE); } else { GetDlgItem(IDC_EDIT_3D_SPT_X_GRID_OFFSET)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_3D_SPT_X_GRID_OFFSET)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT_3D_SPT_Y_GRID_OFFSET)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_3D_SPT_Y_GRID_OFFSET)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT_3D_SPT_A_POS)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC_SPT_MIN_AB_SPACE)->ShowWindow(SW_HIDE); m_fEditABSpace.ShowWindow(SW_HIDE); m_fEditMinAMSpace.ShowWindow(SW_HIDE); m_cmbSptRunMethod.EnableWindow(TRUE); if (LANG_ZHCN == g_iUILanguage) { GetDlgItem(IDC_STATIC_SPT_X_GRID_OFFSET)->SetWindowText(_T("X轴网格偏移")); GetDlgItem(IDC_STATIC_SPT_Y_GRID_OFFSET)->SetWindowText(_T("Y轴网格偏移")); } else { GetDlgItem(IDC_STATIC_SPT_X_GRID_OFFSET)->SetWindowText(_T("X Grid Offset")); GetDlgItem(IDC_STATIC_SPT_Y_GRID_OFFSET)->SetWindowText(_T("Y Grid Offset")); } } } //Invalidate(); } bool CDialCreateNew3DSpt::GetMeasureZone(int iRunMethod, DWORD dwArray, int &iEnableZoneCnt,int &iDisableZoneCnt) { iEnableZoneCnt = 0; iDisableZoneCnt = 0; memset(m_zone, 0, sizeof(m_zone)); memset(m_DisZone, 0, sizeof(m_DisZone)); switch (iRunMethod) { case EN_3D_SPT_FULL_MEASURE: if ((EN_3D_SPT_POLE_POLE != dwArray) && (EN_3D_SPT_MID_GARDIENT != dwArray)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("全测量方法只是用于单极-单极和中梯扫描")); else MessageBoxEx(NULL, _T("Full Measurement can be only used in pole-pole and mid-gardient-scan."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } m_zone[0] = 0; m_zone[1] = 1; m_zone[2] = 2; m_zone[3] = 3; iEnableZoneCnt = 4; break; case EN_3D_SPT_CROSS_DIAGONAL: if (EN_3D_SPT_POLE_POLE == dwArray) { m_zone[0] = 0; m_zone[1] = 1; m_zone[2] = 2; m_zone[3] = 3; iEnableZoneCnt = 4; } else { m_zone[0] = 0; m_zone[1] = 1; m_zone[2] = 2; m_zone[3] = 3; m_zone[4] = 4; m_zone[5] = 5; m_zone[6] = 6; m_zone[7] = 7; iEnableZoneCnt = 8; } break; case EN_3D_SPT_CROSS_MEASURE: if (EN_3D_SPT_POLE_POLE == dwArray) { m_zone[0] = 0; m_zone[1] = 2; iEnableZoneCnt = 2; } else { m_zone[0] = 0; m_zone[1] = 2; m_zone[2] = 4; m_zone[3] = 6; iEnableZoneCnt = 4; } break; default: CString strErr = _T(""); strErr.Format(_T("Unknow measurement type = %d"),iRunMethod); MessageBoxEx(NULL, strErr, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } return true; } void CDialCreateNew3DSpt::OnOK() { // TODO: Add extra validation here if (!CheckValueValid()) { return; } CMedium3D *pMedium3D = NULL; CSptRecord* pSptRecord = NULL; DWORD dwMedHandle = (DWORD)VAL_ZERO; int iAR = (int)VAL_ZERO; iAR = m_cmdSptArray.GetItemData(m_cmdSptArray.GetCurSel()); int iZoneCnt = 0, iDisZoneCnt = 0; DWORD dwMeasureMethod = m_cmbSptRunMethod.GetItemData(m_cmbSptRunMethod.GetCurSel()); if (!GetMeasureZone(dwMeasureMethod, iAR, iZoneCnt, iDisZoneCnt)) { return; } //由于只有单通道,所以在这里直接获取数据链表中头部信息的位置 POSITION pos = m_pNewScript->m_chaList.GetHeadPosition(); CChannel* pChannel = (CChannel*)m_pNewScript->m_chaList.GetAt(pos); if (NULL == pChannel) { MessageBoxEx(NULL, _T("Get channel information error!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } dwMedHandle = m_handleProcessor.GenerateHandle(iAR, PZ_STYLE_MED_DEF); pChannel->m_pMedium = m_pMedLinkList->Find(dwMedHandle); if (AR_LAND_FILL_ONE == iAR || AR_LAND_FILL_TWO == iAR) { pChannel->m_pMedium->m_iAR = iAR; } pMedium3D = (CMedium3D *)(pChannel->m_pMedium); pMedium3D->SetStackNumber(m_uiIterationNumber); //初始化3d脚本对象 pMedium3D->create(); //如果是全测量则需要测量区域内所有的点,如果不是,则只测量45度的对角线和边界上的点 if (EN_3D_SPT_CROSS_DIAGONAL == dwMeasureMethod) pMedium3D->SetFlags(TRUE); else pMedium3D->SetFlags(FALSE); int iTestLineDirection = m_comCableDirection.GetCurSel(); //Y方向电缆布线,此操作只用于控制生成脚本测点 if (0 == iTestLineDirection) { pMedium3D->SetRect(0, 0, m_uiXGridSize - 1, m_uiYGridSize - 1); } else { pMedium3D->SetRect(0, 0, m_uiYGridSize - 1, m_uiXGridSize - 1); } //设置电极步长 pMedium3D->SetPoleStep(m_uiStepX, m_uiStepY); //设置电极间距 pMedium3D->SetPoleDistance(m_fXPoleDistance, m_fYPoleDistance); //设置需要生成的测点区域 pMedium3D->setZone(true, iZoneCnt, m_zone); STMidGarScanParam stMidGarScan; if (EN_3D_SPT_MID_GARDIENT == iAR) { CString strMinAMSpace = _T(""); m_fEditMinAMSpace.GetWindowText(strMinAMSpace); stMidGarScan.fABSpace = m_fABSpace; stMidGarScan.fAPosY = m_fAPosY; stMidGarScan.fMinAMSpace = atof(strMinAMSpace); pMedium3D->SetParamVal(&stMidGarScan); } if (iDisZoneCnt > 0) { // pMedium3D->setZone(false, iDisZoneCnt, m_DisZone); } //执行脚本生成 if (!pMedium3D->generate()) { // AfxMessageBox("error"); return; } //3d脚本不再使用该字段记录测点总数 m_pNewScript->m_iEAmount = pMedium3D->getPoleCount(); pChannel->ClearSptRecList(); pMedium3D->GenerateSptRecElecVal3D(m_iSplitSptNum, m_pNewScript, &(pChannel->m_iPtAmount), &(pChannel->m_sptRecArray)); if (theApp.m_ucIsMultiChannel > 0) { if ((21 < iAR && iAR < 25) || 29 == iAR || AR_LAND_FILL_ONE == iAR || AR_LAND_FILL_TWO == iAR) { pMedium3D->SortMulChannelSpt(&(pChannel->m_sptRecArray)); } } pMedium3D->Destroy(); //test ////////////////////////////////////////////////////////////////////////// // m_CreateDate = CTime::GetCurrentTime(); ////////////////////////////////////////////////////////////////////////// if (EN_3D_SPT_MID_GARDIENT == iAR) { m_strPoleStep.Empty(); m_strPoleStep.Format(_T("%.2f,%.2f"), m_fABSpace,m_fAPosX); //此时记录的是AB和MN在同一水平轴时交点的位置坐标 m_strPoleStart.Empty(); m_strPoleStart.Format(_T("%.2f,%.2f"), m_fAPosX+stMidGarScan.fMinAMSpace, m_fAPosY); } CDialog::OnOK(); } int CDialCreateNew3DSpt::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here return 0; } void CDialCreateNew3DSpt::OnCbnSelchangeCombo3dSptCableDirection() { if (!UpdateData(TRUE)) { return; } //先判断电极间距和电极个数效验 if (!bIsInteger(m_strGridXSize)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("X轴网格大小须为正整数.")); else MessageBoxEx(NULL, _T("Please input an integer on X Grid Size"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (!bIsInteger(m_strGridYSize)) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("Y轴网格大小须为正整数.")); else MessageBoxEx(NULL, _T("Please input an integer on Y Grid Size"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } CString strTmp = _T(""); m_fEditXPoleSpace.GetWindowText(strTmp); m_fXPoleDistance = atof(strTmp); strTmp.Empty(); m_fEditYPoleSpace.GetWindowText(strTmp); m_fYPoleDistance = atof(strTmp); m_uiXGridSize = atoi(m_strGridXSize); m_uiYGridSize = atoi(m_strGridYSize); if (m_uiXGridSize < 2 || m_uiXGridSize > MAX_GRID_SIZE) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("X轴网格大小须为2到100之间的整数.")); else MessageBoxEx(NULL, _T("Please input an integer from 2 to 100 on X Grid Size."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (m_uiYGridSize < 2 || m_uiYGridSize > MAX_GRID_SIZE) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("Y轴网格大小须为2到100之间的整数.")); else MessageBoxEx(NULL, _T("Please input an integer from 2 to 100 on Y Grid Size."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (m_fXPoleDistance <= 0 || m_fXPoleDistance > MAX_POLE_DISTANCE) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("X轴电极间距0-100000之间.")); else MessageBoxEx(NULL, _T("Please input a positive number between 0 and 100000 on X Pole Distance."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } if (m_fYPoleDistance <= 0 || m_fYPoleDistance > MAX_POLE_DISTANCE) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("Y轴电极间距0-100000之间.")); else MessageBoxEx(NULL, _T("Please input a positive number between 0 and 100000 on Y Pole Distance."), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return; } //设置绘制排序方式 int iAR = m_cmdSptArray.GetItemData(m_cmdSptArray.GetCurSel()); if (EN_3D_SPT_LAND_FILL_ONE == iAR || EN_3D_SPT_LAND_FILL_TWO == iAR) { CDialog3DScriptDrawingBoard::GetInstance()->SetZOrderMethod(TRUE); } else { CDialog3DScriptDrawingBoard::GetInstance()->SetZOrderMethod(FALSE); } //X方向 if (m_comCableDirection.GetCurSel() == 0) { CDialog3DScriptDrawingBoard::GetInstance()->SetCableDirectionType(EN_CABLE_X_DIRECTION); } //Y方向 else if (m_comCableDirection.GetCurSel() == 1) { CDialog3DScriptDrawingBoard::GetInstance()->SetCableDirectionType(EN_CABLE_Y_DIRECTION); } CDialog3DScriptDrawingBoard::GetInstance()->SetXElectrodeNumber(m_uiXGridSize); CDialog3DScriptDrawingBoard::GetInstance()->SetYElectrodeNumber(m_uiYGridSize); CDialog3DScriptDrawingBoard::GetInstance()->SetXElectrodeDistance(m_fXPoleDistance); CDialog3DScriptDrawingBoard::GetInstance()->SetYElectrodeDistance(m_fYPoleDistance); CDialog3DScriptDrawingBoard::GetInstance()->RedrawWindow(); }