Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

966 lines
32 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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<CMedium*>* 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-5double精度误差在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();
}