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

1917 lines
46 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.
// SaveInIP.cpp: implementation of the CSaveInIP class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SaveInIP.h"
#include "Constant.h"
#include "CtrlProtocolDef.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern int g_iUILanguage;
extern HHOOK hHook;
extern LRESULT __stdcall CBTHookProc(long nCode, WPARAM wParam, LPARAM lParam);
CSaveInIP::CSaveInIP()
{
m_resFile = NULL;
m_nFirstPole = 0;
m_nLandSign = 0;
m_MediumType = 0;
/* m_rect = NULL;*/
m_szDistancePole = _T("");
m_szPoleStart = _T("1");
m_methodType = 0;
m_nPoleStepX=0;
m_nPoleStepY=0;
m_fXDistancePole = 0;
m_fYDistancePole = 0;
m_fPoleDistance = 0;
m_i3DRollDiecetion = 0;
m_fABDistance = 0;
m_fMinAMDistance = 0 ;
m_fAPosX = 0;
m_fAPosY = 0;
}
CSaveInIP::~CSaveInIP()
{
}
BOOL CSaveInIP::CreateIPFile(CString szFilePath)
{
m_resFile = fopen(szFilePath, "w");
if (m_resFile == NULL)
{
CString strInfo = _T("");
if (LANG_ZHCN == g_iUILanguage)
{
strInfo.Format(_T("打开文件失败, fileinfo = %s, errorno = %d"), szFilePath.GetBuffer(0), GetLastError());
AfxMessageBox(strInfo.GetBuffer(0));
}
else
{
strInfo.Format(_T("Open file failed, fileinfo = %s, errorno = %d"), szFilePath.GetBuffer(0), GetLastError());
MessageBoxEx(NULL, strInfo, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
return FALSE;
}
return TRUE;
}
BOOL CSaveInIP::AddDateToFile(CStringArray *szDateArray)
{
CString szData;
szData.Empty();
CStringArray szDealDataArray;
szDealDataArray.RemoveAll();
//[1,16]属于2D>21是3D
switch(m_MediumType)
{
case 1://温纳
Wenner_2D(szDateArray,&szDealDataArray);
break;
case 2://偶极
dipole_2D(szDateArray,&szDealDataArray);
break;
case 3:
Wenner_Y_2D(szDateArray,&szDealDataArray);
break;
case 4:
Pole_dipole_2d(szDateArray,&szDealDataArray);
break;
case 5:
Reverse_Pole_dipole_2d(szDateArray,&szDealDataArray);
break;
case 6:
A_M_ARRAY_2D(szDateArray,&szDealDataArray);
break;
case 7:
AMN_ARRAY_2D(szDateArray,&szDealDataArray);
break;
case 9:
Dipole_Dipole_2D(szDateArray,&szDealDataArray);
break;
case 11://斯伦贝谢
Schlumberger_2D(szDateArray,&szDealDataArray);
break;
case 17:
if (LANG_ZHCN == g_iUILanguage)
{
AfxMessageBox(_T("暂不支持装置类型=17"));
}
else
{
MessageBoxEx(NULL, _T("Not Support MediumType = 17"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
// CE_Schlumberger(szDateArray,&szDealDataArray);
return FALSE;
case 22:
Pole_Pole_3D(szDateArray,&szDealDataArray);
break;
case 23:
Pole_Dipole_3D(szDateArray,&szDealDataArray);
break;
case 24:
Dipole_Dipole_3D(szDateArray,&szDealDataArray);
break;
case 25:
Schlumberger3D(szDateArray,&szDealDataArray);
break;
case 26:
WennerAlfa3D(szDateArray,&szDealDataArray);
break;
case 27:
WennerBeta3D(szDateArray,&szDealDataArray);
break;
case 28:
Gradient_3D(szDateArray,&szDealDataArray);
break;
case 29:
Mid_Gardient_Scan_3D(szDateArray,&szDealDataArray);
break;
case 50: //to be do , louis
case 39:
Wenner_Schlumberger_2D(szDateArray,&szDealDataArray);
break;
//由于边缘梯度的排列和用户自定义一样,在这里就直接沿用了用户自定义的排列
case 40:
case 41:
case 43:
Custom_2D(szDateArray,&szDealDataArray);
break;
default:
return FALSE;
}
szData.Empty();
for (int nIndex = 0; nIndex < szDealDataArray.GetSize(); nIndex++)
{
szData += szDealDataArray.GetAt(nIndex);
if(nIndex != szDealDataArray.GetSize() - 1)
szData += " ";
}
szData += "\n";
fwrite(szData.GetBuffer(szData.GetLength()), 1, szData.GetLength(), m_resFile);
szData.Empty();
fflush(m_resFile);
return TRUE;
}
CString CSaveInIP::TransformMediumType(CString szMediumType)
{
CString szResult;
int nType;
szResult.Empty();
szResult = szMediumType;
nType = atoi(szResult);
szResult.Empty();
switch (nType)//nType是我们的装置类型
{
case 1:
szResult = "1";
break;
case 2:
szResult = "4";
break;
case 3:
szResult = "5";
break;
case 4:
szResult = "6";
break;
case 5:
szResult = "6";
break;
case 6:
szResult = "2";
break;
case 7:
szResult = "6";
break;
case 8:
szResult = szMediumType;
break;
case 9:
szResult = "3";
break;
case 10:
szResult = szMediumType;
break;
case 11:
szResult = "7";
break;
case 12:
szResult = szMediumType;
break;
case 13:
szResult = szMediumType;
break;
case 14:
szResult = szMediumType;
break;
case 15:
szResult = szMediumType;
break;
case 16:
szResult = szMediumType;
break;
case 18:
break;
case 22:
szResult = "2";
break;
case 23:
szResult = "6";
break;
case 24:
szResult = "3";
break;
case 25:
szResult = "7";
break;
case 26:
szResult = "1";
break;
case 27:
szResult = "4";
break;
case 28:
szResult = "11";
break;
case 29:
szResult = "11";
break;
case 50://to be do , louis
case 39:
szResult = "7";
break;
case 40:
case 41:
case 43:
szResult = "11";
break;
default:
return "NULL";
}
return szResult;
}
BOOL CSaveInIP::CloseFile()
{
switch (m_MediumType)
{
case 2:
case 11:
WriteZero(6);
break;
case 25:
case 26:
case 27:
WriteZero(5);
break;
default:
WriteZero(4);
}
if (m_resFile)
{
fclose(m_resFile);
}
return FALSE;
}
void CSaveInIP::WriteZero(int nCount)
{
for(int nIndex = 0; nIndex < nCount; nIndex++)
{
fwrite("0\r\n",1,3,m_resFile);
fflush(m_resFile);
}
}
void CSaveInIP::Wenner_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
//szSRCArray这五个值得顺序分别是 0:A的位置 1:B的位置 2:M的位置 3:N的位置 4:R0
//Wenner的计算值有三列,计算公式分别:
//第一列:A * 间距
//第二列:(M-A) * 间距
//第三列:R0
//第四列:视电阻率M,暂时先填入一个暂时值
//不需要层数
szTARArray->RemoveAll();
//第一列:
DOUBLE dRowInfo = 0;
CString strRowInfo = _T("");
dRowInfo = (0.5*(atof(szSRCArray->GetAt(2)) + atof(szSRCArray->GetAt(3)))-1) * atof(m_szDistancePole.GetBuffer(0));
strRowInfo.Format("%.2f",fabs(dRowInfo));
szTARArray->Add(strRowInfo);
//第二列:
strRowInfo.Empty();
dRowInfo = (atof(szSRCArray->GetAt(2)) - atof(szSRCArray->GetAt(0)) ) * atof(m_szDistancePole.GetBuffer(0));
strRowInfo.Format("%.2f", dRowInfo);
szTARArray->Add(strRowInfo);
//第三列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(4));
strRowInfo.Format("%.5f",fabs(dRowInfo));
szTARArray->Add(strRowInfo);
//第四列:
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(5));
strRowInfo.Format("%.4f", dRowInfo);
szTARArray->Add(strRowInfo);
}
void CSaveInIP::Schlumberger_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
//szSRCArray这五个值得顺序分别是 0:A的位置 1:B的位置 2:M的位置 3:N的位置 4:R0
//Schlumberger的计算值有四列,计算公式分别:
//第一列:A * m_szDistancePole
//第二列:(p2 - p1) * m_szDistancePole
//第三列:(p1 - c1) / (p2 - p1), 层数
//第四列:R0
//第五列:视电阻率M
szTARArray->RemoveAll();
//第一列:
DOUBLE dRowInfo = 0;
DOUBLE fDistancePole = atof(m_szDistancePole.GetBuffer(0));
CString strRowInfo = _T("");
dRowInfo = (0.5*(atof(szSRCArray->GetAt(2)) + atof(szSRCArray->GetAt(3)))-1) * fDistancePole;
strRowInfo.Format("%.2f",dRowInfo);
szTARArray->Add(strRowInfo);
//第二列:
strRowInfo.Empty();
dRowInfo = ( atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)) ) * fDistancePole;
strRowInfo.Format("%.2f",dRowInfo);
szTARArray->Add(strRowInfo);
//第三列
strRowInfo.Empty();
dRowInfo = ( atof(szSRCArray->GetAt(2)) - atof(szSRCArray->GetAt(0)) ) / ( atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)) );
strRowInfo.Format("%.5f",fabs(dRowInfo));
szTARArray->Add(strRowInfo);
//第四列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(4));
strRowInfo.Format("%.2f",dRowInfo);
szTARArray->Add(strRowInfo);
//第五列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(5));
strRowInfo.Format("%.4f",dRowInfo);
szTARArray->Add(strRowInfo);
}
void CSaveInIP::dipole_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
//szSRCArray这五个值得顺序分别是 0:A的位置 1:B的位置 2:M的位置 3:N的位置 4:R0
//Schlumberger的计算值有四列,计算公式分别:
//第一列:C2 * m_szDistancePole
//第二列:(C1 - C2) * m_szDistancePole
//第三列:(P1-C1) / (C1 - C2) ,偶极分离因子
//第四列:R0
//第五列:视电阻率M
szTARArray->RemoveAll();
//第一列:
DOUBLE firstRow;
CString szFirstRow;
DOUBLE fdistance = atof(m_szDistancePole);//m_szDistancePole成员变量,保存了电极间距
firstRow = (0.5*(atof(szSRCArray->GetAt(2)) + atof(szSRCArray->GetAt(0)))-1) * fdistance;
szFirstRow.Format("%.3f",fabs(firstRow));
szTARArray->Add(szFirstRow);
//第二列:
CString szSencondRow;
DOUBLE fSencondRow;
fSencondRow = ( atof(szSRCArray->GetAt(0)) - atof(szSRCArray->GetAt(1)) ) * fdistance;
szSencondRow.Format("%.3f",fabs(fSencondRow));
szTARArray->Add(szSencondRow);
//第三列
DOUBLE thirdRow;
CString szThirdRow;
thirdRow = atof(szSRCArray->GetAt(4));
szThirdRow.Format("%.5f",fabs(thirdRow));
szTARArray->Add(szThirdRow);
//第四列
DOUBLE fourRow;
CString szfourRow;
fourRow = atof(szSRCArray->GetAt(5));
szfourRow.Empty();
szfourRow.Format("%.4f",fabs(fourRow));
szTARArray->Add(szfourRow);
}
BOOL CSaveInIP::WriteLandInform(CStringArray *f_szArray)
{
CString szNum;
szNum.Format("%d\n", m_nLandSign);
fwrite(szNum.GetBuffer(0), szNum.GetLength(), 1, m_resFile);
//写入地型数据标志 和 地型数据点的个数
szNum.Format("%d\n", f_szArray->GetSize());
fwrite(szNum.GetBuffer(0), szNum.GetLength(), 1, m_resFile);
for (int i = 0; i < f_szArray->GetSize(); i++)
{
szNum = f_szArray->GetAt(i);
szNum += "\n";
fwrite(szNum.GetBuffer(0), szNum.GetLength(), 1, m_resFile);
}
szNum.Format("%d\n", m_nFirstPole);
fwrite(szNum.GetBuffer(0), szNum.GetLength(), 1, m_resFile);
return TRUE;
}
void CSaveInIP::WennerAlfa3D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
/*
按顺序传入A、B、M、N、R0 5个值
*/
int A = 0, B = 1, M = 2, N = 3, R = 4;
// int nSort[4] = {A, M, N, B};
int nSort[4] = {A, B, M, N};
int nId = 0;
int nPoleStart = 0;
_pos *Pos = NULL;
CString szTmp = _T("");
int nTmp = 0;
nPoleStart = atoi(m_szPoleStart.GetBuffer(m_szPoleStart.GetLength()));
Pos = new _pos();
_rect tmpRect;
//如果是按照Y轴合并,由于m_rect已经是旋转过后的矩阵,那么在计算时,还要将其旋转回去进行计算
//因为pole_to_pos函数是按照电极的长度对于X轴来进行解析的
if (2 == m_i3DRollDiecetion)
{
tmpRect.x0 = m_rect.y0;
tmpRect.x1 = m_rect.y1;
tmpRect.y0 = m_rect.x0;
tmpRect.y1 = m_rect.x1;
}
else
{
tmpRect.x0 = m_rect.x0;
tmpRect.x1 = m_rect.x1;
tmpRect.y0 = m_rect.y0;
tmpRect.y1 = m_rect.y1;
}
for(int i = 0; i < 4; i++)
{
nId = nSort[i];
szTmp = szSRCArray->GetAt(nId);
nTmp = atoi(szTmp.GetBuffer(0));
pole_to_pos(&tmpRect, nPoleStart, m_nPoleStepX, m_nPoleStepY, Pos, nTmp);
//如果是按照Y轴方向合并,则需要进行逻辑坐标轴的转换
//此时转换之需要颠倒X轴和Y轴的位置就好
if (2 == m_i3DRollDiecetion)
{
int iTmp = Pos->x;
Pos->x = Pos->y;
Pos->y = iTmp;
}
szTmp.Empty();
szTmp.Format("%.2f",(float)(Pos->x * m_fXDistancePole));
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.2f",(float)(Pos->y * m_fYDistancePole));
szTARArray->Add(szTmp);
}
szTmp.Empty();
szTmp = szSRCArray->GetAt(4);
szTARArray->Add(szTmp);
//视电阻率M???
szTARArray->Add(szSRCArray->GetAt(5));
delete Pos;
Pos = NULL;
}
void CSaveInIP::WennerBeta3D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
/*
按顺序传入A、B、M、N、R0 5个值
*/
int A = 0, B = 1, M = 2, N = 3, R = 4;
int nSort[4] = {A, B, M, N};
int nId = 0;
_pos *Pos = NULL;
CString szTmp = _T("");
int nTmp = 0;
int nPoleStart = 0;
int nDistancePole = 0;
nPoleStart = atoi(m_szPoleStart.GetBuffer(m_szPoleStart.GetLength()));
Pos = new _pos();
_rect tmpRect;
//如果是按照Y轴合并,由于m_rect已经是旋转过后的矩阵,那么在计算时,还要将其旋转回去进行计算
//因为pole_to_pos函数是按照电极的长度对于X轴来进行解析的
if (2 == m_i3DRollDiecetion)
{
tmpRect.x0 = m_rect.y0;
tmpRect.x1 = m_rect.y1;
tmpRect.y0 = m_rect.x0;
tmpRect.y1 = m_rect.x1;
}
else
{
tmpRect.x0 = m_rect.x0;
tmpRect.x1 = m_rect.x1;
tmpRect.y0 = m_rect.y0;
tmpRect.y1 = m_rect.y1;
}
for(int i = 0; i < 4; i++)
{
nId = nSort[i];
szTmp = szSRCArray->GetAt(nId);
nTmp = atoi(szTmp.GetBuffer(0));
pole_to_pos(&tmpRect, nPoleStart, m_nPoleStepX, m_nPoleStepY, Pos, nTmp);
//如果是按照Y轴方向合并,则需要进行逻辑坐标轴的转换
//此时转换之需要颠倒X轴和Y轴的位置就好
if (2 == m_i3DRollDiecetion)
{
int iTmp = Pos->x;
Pos->x = Pos->y;
Pos->y = iTmp;
}
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->x * m_fXDistancePole));
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->y * m_fYDistancePole));
szTARArray->Add(szTmp);
}
// int q = szSRCArray->GetSize();
szTmp.Empty();
szTmp = szSRCArray->GetAt(4);
szTARArray->Add(szTmp);
//视电阻率M???
szTARArray->Add(szSRCArray->GetAt(5));
delete Pos;
Pos = NULL;
}
void CSaveInIP::Schlumberger3D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
/*
按顺序传入A、B、M、N、R0 5个值
*/
int A = 0, B = 1, M = 2, N = 3, R = 4;
// int nSort[4] = {A, M, N, B};
int nSort[4] = {A, B, M, N};
int nId = 0;
int nPoleStart = 0;
_pos *Pos = NULL;
CString szTmp = _T("");
int nTmp = 0;
Pos = new _pos();
nPoleStart = atoi(m_szPoleStart.GetBuffer(m_szPoleStart.GetLength()));
_rect tmpRect;
//如果是按照Y轴合并,由于m_rect已经是旋转过后的矩阵,那么在计算时,还要将其旋转回去进行计算
//因为pole_to_pos函数是按照电极的长度对于X轴来进行解析的
if (2 == m_i3DRollDiecetion)
{
tmpRect.x0 = m_rect.y0;
tmpRect.x1 = m_rect.y1;
tmpRect.y0 = m_rect.x0;
tmpRect.y1 = m_rect.x1;
}
else
{
tmpRect.x0 = m_rect.x0;
tmpRect.x1 = m_rect.x1;
tmpRect.y0 = m_rect.y0;
tmpRect.y1 = m_rect.y1;
}
for(int i = 0; i < 4; i++)
{
nId = nSort[i];
szTmp = szSRCArray->GetAt(nId);
nTmp = atoi(szTmp.GetBuffer(0));
pole_to_pos(&tmpRect, nPoleStart, m_nPoleStepX, m_nPoleStepY, Pos, nTmp);
//如果是按照Y轴方向合并,则需要进行逻辑坐标轴的转换
//此时转换之需要颠倒X轴和Y轴的位置就好
if (2 == m_i3DRollDiecetion)
{
int iTmp = Pos->x;
Pos->x = Pos->y;
Pos->y = iTmp;
}
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->x * m_fXDistancePole));
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->y * m_fYDistancePole));
szTARArray->Add(szTmp);
}
szTmp.Empty();
szTmp = szSRCArray->GetAt(4);
szTARArray->Add(szTmp);
//视电阻率M???
szTARArray->Add(szSRCArray->GetAt(5));
delete Pos;
Pos = NULL;
}
bool CSaveInIP::AddFileHeader(int method, int mediumType, CStringArray *szDataArray)
{
m_MediumType = mediumType; //保存在装置类型
m_methodType = method; //保存测试方法(电阻率Res,激电IP...)
if (mediumType >= 17 && mediumType <= 21) //1D脚本装置类型
{
// InitCEFileHeader(szDataArray);
CString strTips;
if (LANG_ZHCN == g_iUILanguage)
{
strTips.Format(_T("不支持装置类型导出,类型 = %d"), mediumType);
AfxMessageBox(strTips);
}
else
{
strTips.Format(_T("Not support mediumType export, type = %d"), mediumType);
MessageBoxEx(NULL, strTips, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
return false;
}
if (mediumType >= 1 && mediumType <= 16|| mediumType >= 39) //2D脚本装置类型
{
Init2DFileHeader(szDataArray);
}
if (mediumType > 21 && mediumType < 39) //3D脚本装置类型
{
Init3DFileHeader(szDataArray);
}
return true;
}
void CSaveInIP::GetInfoFromString(CString strInfo, CString strBreak, std::vector<CString>& vtRes)
{
vtRes.clear();
if (strInfo.IsEmpty())
{
return;
}
int nStart = 0;
int nPos = strInfo.Find(strBreak.GetBuffer(0));
CString strTmp = _T("");
while (-1 != nPos)
{
strTmp = strInfo.Mid(nStart, nPos - nStart);
vtRes.push_back(strTmp);
nStart = nPos + 1;
nPos = strInfo.Find(strBreak.GetBuffer(0), nStart);
}
//如果此时容器不为空,说明字符串中有出现过分隔符,此时将字符中最后一些内容取出
if (!vtRes.empty())
{
strTmp = strInfo.Right(strInfo.GetLength() - nStart);
vtRes.push_back(strTmp);
}
return ;
}
void CSaveInIP::Init3DFileHeader(CStringArray *szArray)
{
//3D的文件头
CString szTmp = _T("");
CString strShow = _T("");
int x0, y0, x1,y1;
std::vector<CString> vtInfo;
if (szArray->GetSize() != 9)
{
if (LANG_ZHCN == g_iUILanguage)
{
strShow.Format(_T("IP3DFileHeader信息错误, 大小 = %d"), szArray->GetSize());
AfxMessageBox(strShow.GetBuffer(0));
}
else
{
strShow.Format(_T("IP3DFileHeader infomation error, size = %d"), szArray->GetSize());
MessageBoxEx(NULL, strShow, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
return ;
}
for (int i = 0; i < szArray->GetSize(); i++)
{
switch (i)
{
case 1: //得到存储电极数矩阵的字符串
szTmp = szArray->GetAt(i);
vtInfo.clear();
GetInfoFromString(szTmp, ",", vtInfo);
if (vtInfo.size() != 4)
{
if (LANG_ZHCN == g_iUILanguage)
{
strShow.Format(_T("解析信息错误, info = %s, size = %d"), szTmp.GetBuffer(0), vtInfo.size());
AfxMessageBox(strShow.GetBuffer(0));
}
else
{
strShow.Format(_T("Parser infomation Error, info = %s, size = %d"), szTmp.GetBuffer(0), vtInfo.size());
MessageBoxEx(NULL, strShow, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
continue;
}
szTmp.Empty();
//如果是中梯则选取AB距离/X轴电极间距作为X轴的网格大小
if (29 == atoi(szArray->GetAt(3)))
{
std::vector<CString> vtTemp;
vtTemp.clear();
CString strTmpInfo = szArray->GetAt(2);
GetInfoFromString(strTmpInfo, ",", vtTemp);
float fXPoleDis = atof(vtTemp[0].GetBuffer(0));
int iXGridSize = (0 == fXPoleDis) ? (int)m_fABDistance : (int)(m_fABDistance/fXPoleDis);
szTmp.Format(_T("%d\r\n%d\r\n"), iXGridSize+1, atoi(vtInfo[3].GetBuffer(0)) - atoi(vtInfo[1].GetBuffer(0))+1);
}
else
szTmp.Format(_T("%d\r\n%d\r\n"), atoi(vtInfo[2].GetBuffer(0)) - atoi(vtInfo[0].GetBuffer(0))+1, atoi(vtInfo[3].GetBuffer(0)) - atoi(vtInfo[1].GetBuffer(0))+1);
m_rect.x0 = atoi(vtInfo[0].GetBuffer(0));
m_rect.y0 = atoi(vtInfo[1].GetBuffer(0));
m_rect.x1 = atoi(vtInfo[2].GetBuffer(0));
m_rect.y1 = atoi(vtInfo[3].GetBuffer(0));
break;
case 2:
szTmp = szArray->GetAt(i);
vtInfo.clear();
GetInfoFromString(szTmp, ",", vtInfo);
if (vtInfo.size() != 2)
{
if (LANG_ZHCN == g_iUILanguage)
{
strShow.Format(_T("解析电极间距信息错误, info = %s, size = %d"), szTmp.GetBuffer(0), vtInfo.size());
AfxMessageBox(strShow.GetBuffer(0));
}
else
{
strShow.Format(_T("Parser Distance Pole infomation Error, info = %s, size = %d"), szTmp.GetBuffer(0), vtInfo.size());
MessageBoxEx(NULL, strShow, STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
}
continue;
}
szTmp.Empty();
szTmp.Format(_T("%.2f\r\n%.2f\r\n"), atof(vtInfo[0].GetBuffer(0)) , atof(vtInfo[1].GetBuffer(0)) );
m_fXDistancePole = atof(vtInfo[0].GetBuffer(0));
m_fYDistancePole = atof(vtInfo[1].GetBuffer(0));
break;
case 3:
szTmp = szArray->GetAt(i);
szTmp = TransformMediumType(szTmp);
if (szTmp == "11")//混合装置
{
szTmp += _T("\r\n0\r\nType of data(0=apparent resistivity,1=resistance)\r\n0");
}
break;
default://0和8
szTmp = szArray->GetAt(i);
break;
}
szTmp += "\r\n";
fwrite(szTmp.GetBuffer(szTmp.GetLength()), 1, szTmp.GetLength(), m_resFile);
fflush(m_resFile);
szTmp.Empty();
}
}
bool CSaveInIP::Init2DFileHeader(CStringArray *szArray)
{
//第一行:文件名
//第二行:电极间距
//第三行:装置类型
//(混合装置多三行,比如说微分,多三行0)???这个需要确定
//第四行:测点总数
//第五行:给出的排列中心位置,在这里固定为0
//第六行:现场IP,在这里固定为1
//第七列:IP数据类型,这里填写Chargeability
//第八列:IP单位,这里填写msec;
CString szData = _T("");
CString szMediumType = _T("");
for (int nIndex = 0; nIndex < szArray->GetSize(); nIndex++)
{
if (nIndex == 1)
{
m_szDistancePole = szArray->GetAt(nIndex);
m_fPoleDistance = atof(m_szDistancePole);
}
if (nIndex == 2)
{
szMediumType = szArray->GetAt(nIndex);//将装置类型保存起来,后面根据这个变量进行不同的运算。
szArray->SetAt(nIndex,TransformMediumType(szMediumType));//这里将装置类型转换成res软件的类型定义表
if (szArray->GetAt(nIndex) == "NULL")
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("转换装置类型失败!"));
else
MessageBoxEx(NULL, _T("Transfer MediumType Failed!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return false;
}
if (szMediumType == "3")//微分属于混合排列类型,文件头需要添加三行0
{
// szArray->InsertAt(nIndex + 1, "0");
// szArray->InsertAt(nIndex + 2, "0");
// szArray->InsertAt(nIndex + 3, "0");
}
}
szData += szArray->GetAt(nIndex);
szData += "\n";
}
fwrite(szData.GetBuffer(szData.GetLength()), 1, szData.GetLength(), m_resFile);
szData.Empty();
fflush(m_resFile);
return true;
}
void CSaveInIP::InitCEFileHeader(CStringArray *szArray)
{
// switch (m_methodType)
// {
// case Res:
// InitCeResHeader(szArray);
// break;
// case IP:
// InitCeIpHeader(szArray);
// break;
// default:
//
// break;
// }
}
void CSaveInIP::InitCeResHeader(CStringArray *szArray)
{
CString szTmp = _T("");
for (int n = 0; n < szArray->GetSize(); n++)
{
switch (n)
{
case 0:
szTmp = szArray->GetAt(n);
break;
case 1:
szTmp = "Array Type\r\nSchlumberger" ;
break;
case 2:
szTmp = "Number of data points\r\n" + szArray->GetAt(n);
szTmp += "\r\nData Type\r\nResistivity";
break;
case 3:
szTmp = "Error in measurements included\r\n" + szArray->GetAt(n);
szTmp += "\r\nData section";
break;
}
szTmp += "\r\n";
fwrite(szTmp.GetBuffer(szTmp.GetLength()), 1, szTmp.GetLength(), m_resFile);
fflush(m_resFile);
szTmp.Empty();
}
}
void CSaveInIP::InitCeIpHeader(CStringArray *szArray)
{
CString szTmp = _T("");
for (int n = 0; n < szArray->GetSize(); n++)
{
switch (n)
{
case 0:
szTmp = szArray->GetAt(n);
break;
case 1:
szTmp = "Array Type\r\nSchlumberger" ;
break;
case 2:
szTmp = "Number of data points\r\n" + szArray->GetAt(n);
szTmp += "\r\nData Type\r\nIP\r\nChargeability\r\nmsec";
break;
case 3:
szTmp += szArray->GetAt(n);
break;
case 4:
szTmp = "Error in measurements included\r\n" + szArray->GetAt(n);
szTmp += "\r\nData section";
break;
}
szTmp += "\r\n";
fwrite(szTmp.GetBuffer(szTmp.GetLength()), 1, szTmp.GetLength(), m_resFile);
fflush(m_resFile);
szTmp.Empty();
}
}
void CSaveInIP::CE_Schlumberger(CStringArray *szSRCArray, CStringArray *szTARArray)
{
switch (m_methodType)
{
case 1:
CE_Res_Schlumberger(szSRCArray, szTARArray);
break;
case 2:
CE_Res_Schlumberger(szSRCArray, szTARArray);//IP和电阻率数据数据主体一样
break;
}
}
void CSaveInIP::CE_Res_Schlumberger(CStringArray *szSRCArray, CStringArray *szTARArray)
{
CString szTmp = _T("");
float fTmp = 0;
for (int n = 0; n < szSRCArray->GetSize(); n++)
{
if (n == 2)
{
fTmp = atof(szSRCArray->GetAt(n));
szTmp.Format("%.4f", fabs(fTmp));
}
else
{
fTmp = atof(szSRCArray->GetAt(n));
szTmp.Format("%.3f", fabs(fTmp));
}
szTARArray->Add(szTmp);
}
}
void CSaveInIP::AddCEModel(CStringArray *szArray)
{
CString szTmp = _T("");
szTmp = szArray->GetAt(0); //取得用户模型选项
if (szTmp == "Yes")
{
//该部分待开发
}
else
{
szTmp = "User Starting Model Available\r\n";
szTmp += "No";
}
szTmp += "\r\n";
fwrite(szTmp.GetBuffer(szTmp.GetLength()), 1, szTmp.GetLength(), m_resFile);
szTmp.Empty();
fflush(m_resFile);
}
void CSaveInIP::Mid_Gardient_Scan_3D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
/*
按顺序传入A、B、M、N、R0 5个值
*/
int A = 0, B = 1, M = 2, N = 3, R = 4;
int nSort[4] = {A, B, M, N};
int nId = 0;
_pos *Pos = NULL;
CString szTmp = _T("");
int nTmp = 0;
int nPoleStart = 0;
int nDistancePole = 0;
nPoleStart = atoi(m_szPoleStart.GetBuffer(m_szPoleStart.GetLength()));
Pos = new _pos();
_rect tmpRect;
//如果是按照Y轴合并,由于m_rect已经是旋转过后的矩阵,那么在计算时,还要将其旋转回去进行计算
//因为pole_to_pos函数是按照电极的长度对于X轴来进行解析的
if (2 == m_i3DRollDiecetion)
{
tmpRect.x0 = m_rect.y0;
tmpRect.x1 = m_rect.y1;
tmpRect.y0 = m_rect.x0;
tmpRect.y1 = m_rect.x1;
}
else
{
tmpRect.x0 = m_rect.x0;
tmpRect.x1 = m_rect.x1;
tmpRect.y0 = m_rect.y0;
tmpRect.y1 = m_rect.y1;
}
szTARArray->Add(_T("4"));
for(int i = 0; i < 4; i++)
{
nId = nSort[i];
szTmp = szSRCArray->GetAt(nId);
nTmp = atoi(szTmp.GetBuffer(0));
pole_to_pos(&tmpRect, nPoleStart, m_nPoleStepX, m_nPoleStepY, Pos, nTmp);
//如果是按照Y轴方向合并,则需要进行逻辑坐标轴的转换
//此时转换之需要颠倒X轴和Y轴的位置就好
if (2 == m_i3DRollDiecetion)
{
int iTmp = Pos->x;
Pos->x = Pos->y;
Pos->y = iTmp;
}
//AB是X轴的基准轴,所以此时Y的位置信息为0
if (i < 2)
{
szTmp.Empty();
szTmp.Format("%.3f",0 + m_fAPosX + i* m_fABDistance);
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.3f",0);
szTARArray->Add(szTmp);
}
else
{
szTmp.Empty();
szTmp.Format("%.3f",m_fAPosX + m_fMinAMDistance + m_fXDistancePole * Pos->x);
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.3f",m_fYDistancePole * Pos->y - m_fAPosY);
szTARArray->Add(szTmp);
}
}
// int q = szSRCArray->GetSize();
szTmp.Empty();
szTmp = szSRCArray->GetAt(4);
szTARArray->Add(szTmp);
//增加时电阻率M???
szTARArray->Add(szSRCArray->GetAt(5));
delete Pos;
Pos = NULL;
}
void CSaveInIP::Dipole_Dipole_3D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
/*
按顺序传入A、B、M、N、R0 5个值
*/
int A = 0, B = 1, M = 2, N = 3, R = 4;
int nSort[4] = {A, B, M, N};
int nId = 0;
_pos *Pos = NULL;
CString szTmp = _T("");
int nTmp = 0;
int nPoleStart = 0;
int nDistancePole = 0;
nPoleStart = atoi(m_szPoleStart.GetBuffer(m_szPoleStart.GetLength()));
Pos = new _pos();
_rect tmpRect;
//如果是按照Y轴合并,由于m_rect已经是旋转过后的矩阵,那么在计算时,还要将其旋转回去进行计算
//因为pole_to_pos函数是按照电极的长度对于X轴来进行解析的
if (2 == m_i3DRollDiecetion)
{
tmpRect.x0 = m_rect.y0;
tmpRect.x1 = m_rect.y1;
tmpRect.y0 = m_rect.x0;
tmpRect.y1 = m_rect.x1;
}
else
{
tmpRect.x0 = m_rect.x0;
tmpRect.x1 = m_rect.x1;
tmpRect.y0 = m_rect.y0;
tmpRect.y1 = m_rect.y1;
}
for(int i = 0; i < 4; i++)
{
nId = nSort[i];
szTmp = szSRCArray->GetAt(nId);
nTmp = atoi(szTmp.GetBuffer(0));
pole_to_pos(&tmpRect, nPoleStart, m_nPoleStepX, m_nPoleStepY, Pos, nTmp);
//如果是按照Y轴方向合并,则需要进行逻辑坐标轴的转换
//此时转换之需要颠倒X轴和Y轴的位置就好
if (2 == m_i3DRollDiecetion)
{
int iTmp = Pos->x;
Pos->x = Pos->y;
Pos->y = iTmp;
}
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->x * m_fXDistancePole));
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->y * m_fYDistancePole));
szTARArray->Add(szTmp);
}
// int q = szSRCArray->GetSize();
szTmp.Empty();
szTmp = szSRCArray->GetAt(4);
szTARArray->Add(szTmp);
//增加时电阻率M???
szTARArray->Add(szSRCArray->GetAt(5));
delete Pos;
Pos = NULL;
}
void CSaveInIP::Set_3D_LandSign(int f_type)
{
CString szTmp = _T("");
szTmp.Format("Topography\r\n%d", f_type);
szTmp += "\r\n";
fwrite(szTmp.GetBuffer(szTmp.GetLength()), 1, szTmp.GetLength(), m_resFile);
szTmp.Empty();
fflush(m_resFile);
}
void CSaveInIP::Add_3D_LandFile(CStringArray *szSRCArray)
{
CString szTmp = _T("");
for (int n = 0; n < szSRCArray->GetSize(); n++)
{
szTmp += szSRCArray->GetAt(n);
szTmp +=" ";
}
szTmp += "\r\n";
fwrite(szTmp.GetBuffer(szTmp.GetLength()), 1, szTmp.GetLength(), m_resFile);
szTmp.Empty();
fflush(m_resFile);
}
//联剖A
void CSaveInIP::Pole_dipole_2d(CStringArray *szSRCArray, CStringArray *szTARArray)
{
//szSRCArray这五个值得顺序分别是 0:A的位置 1:B的位置 2:M的位置 3:N的位置 4:R0
//Pole_dipole_2d的计算值有四列,计算公式分别:
//第一列:C1 * 间距
//第二列:(p2 - p1) * 间距
//第三列:(p1 - c1)/(p2 - p1),页就是层数
//第四列:R0
//第五列:视电阻率M
szTARArray->RemoveAll();
//第一列:
DOUBLE dRowInfo = 0;;
DOUBLE fDistancePole = atof(m_szDistancePole.GetBuffer(0));
CString strRowInfo = _T("");
//modified by lsq 20160716
//将记录点的位置改为M点位置
dRowInfo = (atof(szSRCArray->GetAt(2)) -1) * fDistancePole;
strRowInfo.Format("%.2f", dRowInfo);
szTARArray->Add(strRowInfo);
//第二列:
strRowInfo.Empty();
dRowInfo = ( atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)) ) * fDistancePole;
strRowInfo.Format("%.2f", dRowInfo);
szTARArray->Add(strRowInfo);
//第三列
strRowInfo.Empty();
dRowInfo = (atof(szSRCArray->GetAt(2)) - atof(szSRCArray->GetAt(0))) / (atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)));
strRowInfo.Format("%.5f",fabs(dRowInfo));
szTARArray->Add(strRowInfo);
//第四列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(4));
strRowInfo.Format("%.2f",dRowInfo);
szTARArray->Add(strRowInfo);
//第五列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(5));
strRowInfo.Format("%.4f",dRowInfo);
szTARArray->Add(strRowInfo);
}
//联剖b
void CSaveInIP::Reverse_Pole_dipole_2d(CStringArray *szSRCArray, CStringArray *szTARArray)
{
//szSRCArray这五个值得顺序分别是 0:A的位置 1:B的位置 2:M的位置 3:N的位置 4:R0
//Reverse_Pole_dipole_2d的计算值有四列,计算公式分别:
//第一列:P1 * 间距
//第二列:(c2 - p2) * 间距
//第三列:(c2 - p2)/(p2 - p1) 层数
//第四列:R0
//第五列:视电阻率M
szTARArray->RemoveAll();
//第一列:
DOUBLE dRowInfo = 0;
DOUBLE fDistancePole = atof(m_szDistancePole.GetBuffer(0));
CString strRowInfo = _T("");
//modified by lsq 20160716
//将记录点的位置改为N点位置
// dRowInfo = (0.5*(atof(szSRCArray->GetAt(2)) + atof(szSRCArray->GetAt(3)))-1) * fDistancePole;
dRowInfo = (atof(szSRCArray->GetAt(3)) - 1) * fDistancePole;
strRowInfo.Format("%.2f",dRowInfo);
szTARArray->Add(strRowInfo);
//第二列:
strRowInfo.Empty();
dRowInfo = ( atof(szSRCArray->GetAt(1)) - atof(szSRCArray->GetAt(3)) ) * fDistancePole;
strRowInfo.Format("%.2f",dRowInfo);
szTARArray->Add(strRowInfo);
//第三列
strRowInfo.Empty();
dRowInfo = (atof(szSRCArray->GetAt(1)) - atof(szSRCArray->GetAt(3))) / (atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)));
strRowInfo.Format("%.5f",fabs(dRowInfo));
szTARArray->Add(strRowInfo);
//第四列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(4));
strRowInfo.Format("%.2f",dRowInfo);
szTARArray->Add(strRowInfo);
//第五列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(5));
strRowInfo.Format("%.4f", dRowInfo);
szTARArray->Add(strRowInfo);
}
//微分排列2d
void CSaveInIP::Wenner_Y_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
//Wenner_Y_2D这五个值得顺序分别是 0:A的位置 1:B的位置 2:M的位置 3:N的位置 4:R0
//Reverse_Pole_dipole_2d的计算值有四列,计算公式分别:
//第0列: 电极数
//第一列:记录点的位置,在这里为BM的中点
//第二列:C2和高程(默认0)
//第三列:P1和高程(默认0)
//第四列:P2和高程(默认0)
//第五列:R0
//第六列:视电阻率M
szTARArray->RemoveAll();
DOUBLE dRowInfo = 0;
CString strRowInfo = _T("");
//电极间距
DOUBLE fdistance = atof(m_szDistancePole);//m_szDistancePole成员变量,保存了电极间距
//第一列
strRowInfo.Empty();
dRowInfo = (0.5*(atof(szSRCArray->GetAt(2)) + atof(szSRCArray->GetAt(1)))-1) * fdistance;
strRowInfo.Format("%.3f",fabs(dRowInfo));
szTARArray->Add(strRowInfo);
//第二列:
strRowInfo.Empty();
dRowInfo = (atof(szSRCArray->GetAt(2)) - atof(szSRCArray->GetAt(0))) * fdistance;
strRowInfo.Format("%.3f",fabs(dRowInfo));
szTARArray->Add(strRowInfo);
//第三列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(4));
strRowInfo.Format("%.5f",fabs(dRowInfo));
szTARArray->Add(strRowInfo);
//第四列
strRowInfo.Empty();
dRowInfo = atof(szSRCArray->GetAt(5));
strRowInfo.Format("%.4f",dRowInfo);
szTARArray->Add(strRowInfo);
}
void CSaveInIP::Pole_Dipole_3D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
int A = 0, B = 1, M = 2, N = 3, R = 4;
int nSort[3] = {A, M, N};
int nId = 0;
_pos *Pos = NULL;
CString szTmp = _T("");
int nTmp = 0;
int nPoleStart = 0;
int nDistancePole = 0;
nPoleStart = atoi(m_szPoleStart.GetBuffer(m_szPoleStart.GetLength()));
Pos = new _pos();
_rect tmpRect;
//如果是按照Y轴合并,由于m_rect已经是旋转过后的矩阵,那么在计算时,还要将其旋转回去进行计算
//因为pole_to_pos函数是按照电极的长度对于X轴来进行解析的
if (2 == m_i3DRollDiecetion)
{
tmpRect.x0 = m_rect.y0;
tmpRect.x1 = m_rect.y1;
tmpRect.y0 = m_rect.x0;
tmpRect.y1 = m_rect.x1;
}
else
{
tmpRect.x0 = m_rect.x0;
tmpRect.x1 = m_rect.x1;
tmpRect.y0 = m_rect.y0;
tmpRect.y1 = m_rect.y1;
}
for(int i = 0; i < 3; i++)
{
nId = nSort[i];
szTmp = szSRCArray->GetAt(nId);
nTmp = atoi(szTmp.GetBuffer(0));
pole_to_pos(&tmpRect, nPoleStart, m_nPoleStepX, m_nPoleStepY, Pos, nTmp);
//如果是按照Y轴方向合并,则需要进行逻辑坐标轴的转换
//此时转换之需要颠倒X轴和Y轴的位置就好
if (2 == m_i3DRollDiecetion)
{
int iTmp = Pos->x;
Pos->x = Pos->y;
Pos->y = iTmp;
}
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->x * m_fXDistancePole));
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->y * m_fYDistancePole));
szTARArray->Add(szTmp);
}
// int q = szSRCArray->GetSize();
szTmp.Empty();
szTmp = szSRCArray->GetAt(4);
szTARArray->Add(szTmp);
//需要增加视电阻率M
szTmp.Empty();
szTmp = szSRCArray->GetAt(5);
szTARArray->Add(szTmp);
delete Pos;
Pos = NULL;
}
void CSaveInIP::Pole_Pole_3D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
int A = 0, B = 1, M = 2, N = 3, R = 4;
int nSort[2] = {A, M};
int nId = 0;
_pos *Pos = NULL;
CString szTmp = _T("");
int nTmp = 0;
int nPoleStart = 0;
int nDistancePole = 0;
nPoleStart = atoi(m_szPoleStart.GetBuffer(m_szPoleStart.GetLength()));
Pos = new _pos();
_rect tmpRect;
//如果是按照Y轴合并,由于m_rect已经是旋转过后的矩阵,那么在计算时,还要将其旋转回去进行计算
//因为pole_to_pos函数是按照电极的长度对于X轴来进行解析的
if (2 == m_i3DRollDiecetion)
{
tmpRect.x0 = m_rect.y0;
tmpRect.x1 = m_rect.y1;
tmpRect.y0 = m_rect.x0;
tmpRect.y1 = m_rect.x1;
}
else
{
tmpRect.x0 = m_rect.x0;
tmpRect.x1 = m_rect.x1;
tmpRect.y0 = m_rect.y0;
tmpRect.y1 = m_rect.y1;
}
for(int i = 0; i < 2; i++)
{
nId = nSort[i];
szTmp = szSRCArray->GetAt(nId);
nTmp = atoi(szTmp.GetBuffer(0));
pole_to_pos_by_normal_axis(&tmpRect, nPoleStart, m_nPoleStepX, m_nPoleStepY, Pos, nTmp);
//如果是按照Y轴方向合并,则需要进行逻辑坐标轴的转换
//此时转换之需要颠倒X轴和Y轴的位置就好
if (2 == m_i3DRollDiecetion)
{
int iTmp = Pos->x;
Pos->x = Pos->y;
Pos->y = iTmp;
}
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->x * m_fXDistancePole));
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->y * m_fYDistancePole));
szTARArray->Add(szTmp);
}
//int q = szSRCArray->GetSize();
szTmp.Empty();
szTmp = szSRCArray->GetAt(4);
szTARArray->Add(szTmp);
//需要再增加视电阻率
szTARArray->Add(szSRCArray->GetAt(5));
delete Pos;
Pos = NULL;
}
//中梯,混合类型
void CSaveInIP::Gradient_3D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
/*
按顺序传入A、B、M、N、R0 5个值
*/
int A = 0, B = 1, M = 2, N = 3, R = 4;
int nSort[2] = {/*A, B, */M, N};
int nId = 0;
_pos *Pos = NULL;
CString szTmp = _T("");
int nTmp = 0;
int nPoleStart = 0;
int nDistancePole = 0;
nPoleStart = atoi(m_szPoleStart.GetBuffer(m_szPoleStart.GetLength()));
Pos = new _pos();
szTARArray->Add("2"); //混合类型前面要跟点击数量
_rect tmpRect;
//如果是按照Y轴合并,由于m_rect已经是旋转过后的矩阵,那么在计算时,还要将其旋转回去进行计算
//因为pole_to_pos函数是按照电极的长度对于X轴来进行解析的
if (2 == m_i3DRollDiecetion)
{
tmpRect.x0 = m_rect.y0;
tmpRect.x1 = m_rect.y1;
tmpRect.y0 = m_rect.x0;
tmpRect.y1 = m_rect.x1;
}
else
{
tmpRect.x0 = m_rect.x0;
tmpRect.x1 = m_rect.x1;
tmpRect.y0 = m_rect.y0;
tmpRect.y1 = m_rect.y1;
}
for(int i = 0; i < 2; i++)
{
nId = nSort[i];
szTmp = szSRCArray->GetAt(nId);
nTmp = atoi(szTmp.GetBuffer(0));
pole_to_pos(&tmpRect, nPoleStart, m_nPoleStepX, m_nPoleStepY, Pos, nTmp);
//如果是按照Y轴方向合并,则需要进行逻辑坐标轴的转换
//此时转换之需要颠倒X轴和Y轴的位置就好
if (2 == m_i3DRollDiecetion)
{
int iTmp = Pos->x;
Pos->x = Pos->y;
Pos->y = iTmp;
}
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->x * m_fXDistancePole));
szTARArray->Add(szTmp);
szTmp.Empty();
szTmp.Format("%.3f",(float)(Pos->y * m_fYDistancePole));
szTARArray->Add(szTmp);
}
int q = szSRCArray->GetSize();
szTmp.Empty();
szTmp = szSRCArray->GetAt(4);
szTARArray->Add(szTmp);
//视电阻率M???
szTARArray->Add(szSRCArray->GetAt(5));
delete Pos;
Pos = NULL;
}
void CSaveInIP::Dipole_Dipole_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
//szSRCArray这五个值得顺序分别是 0:A的位置 1:B的位置 2:M的位置 3:N的位置 4:R0
//Pole_dipole_2d的计算值有四列,计算公式分别:
//第一列:C1 * 间距
//第二列:(p2 - p1) * 间距
//第三列:第三列:(p1 - c1) / (p2 - p1),层数,这个数要不就是整数,如果不是整数的话,那么至少要有5位数字
//第四列:R0
//第四列:视电阻率M,暂时填入某个值,等待算法更新
szTARArray->RemoveAll();
//第一列:
DOUBLE dRowInfo = 0;
DOUBLE fDistancePole = atof(m_szDistancePole.GetBuffer(0));
CString strRow = _T("");
dRowInfo = (0.5*(atof(szSRCArray->GetAt(2))+atof(szSRCArray->GetAt(0)))-1) * fDistancePole;
strRow.Format("%.2f",dRowInfo);
szTARArray->Add(strRow);
//第二列:
strRow.Empty();
dRowInfo = ( atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)) ) * fDistancePole;
strRow.Format("%.4f",dRowInfo);
szTARArray->Add(strRow);
//第三列
strRow.Empty();
dRowInfo = ( atof(szSRCArray->GetAt(2)) - atof(szSRCArray->GetAt(0)) ) / ( atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)) );
strRow.Format("%.5f",dRowInfo);
szTARArray->Add(strRow);
//第四列
strRow.Empty();
dRowInfo = atof(szSRCArray->GetAt(4));
strRow.Format("%.4f",dRowInfo);
szTARArray->Add(strRow);
//第五列
dRowInfo = atof(szSRCArray->GetAt(5));
strRow.Empty();
strRow.Format("%.4f", dRowInfo);
szTARArray->Add(strRow);
}
void CSaveInIP::SetPoleStep(int f_StepX, int f_StepY)
{
m_nPoleStepX = f_StepX;
m_nPoleStepY = f_StepY;
}
void CSaveInIP::Custom_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
if (szSRCArray->GetSize()<6)
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("数据格式错误在Custom_array"));
else
MessageBoxEx(NULL, _T("Data format error in Custom_array!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return;
}
szTARArray->RemoveAll();
float fVal = 0;
CString strZVal = _T("0.000");
int iRealPoleCnt = 0;
for (int i = 0; i < 4; i++)
{
if (atof(szSRCArray->GetAt(i)) > 0)
{
iRealPoleCnt++;
}
}
CString strVal = _T("");
strVal.Format(_T("%d"),iRealPoleCnt);
//第1列电极的个数,为实际电极的个数
szTARArray->Add(strVal);
//第2,3列A点的位置和Z位置
fVal = atof(szSRCArray->GetAt(0));
if (fVal > 0)
{
strVal.Empty();
strVal.Format(_T("%.3f"), m_fPoleDistance*fVal);
szTARArray->Add(strVal);
szTARArray->Add(strZVal);
}
//第4,5列B点的位置和Z位置
fVal = atof(szSRCArray->GetAt(1));
if (fVal > 0)
{
strVal.Empty();
strVal.Format(_T("%.3f"), m_fPoleDistance*fVal);
szTARArray->Add(strVal);
szTARArray->Add(strZVal);
}
//第6,7列M点的位置和Z位置
fVal = atof(szSRCArray->GetAt(2));
if (fVal > 0)
{
strVal.Empty();
strVal.Format(_T("%.3f"), m_fPoleDistance*fVal);
szTARArray->Add(strVal);
szTARArray->Add(strZVal);
}
//第8,9列N点的位置和Z位置
fVal = atof(szSRCArray->GetAt(3));
if (fVal > 0)
{
strVal.Empty();
strVal.Format(_T("%.3f"), m_fPoleDistance*fVal);
szTARArray->Add(strVal);
szTARArray->Add(strZVal);
}
//第10列RO的值
fVal = atof(szSRCArray->GetAt(4));
strVal.Empty();
strVal.Format(_T("%.3f"),fVal);
szTARArray->Add(strVal);
//第11列极化率
fVal = atof(szSRCArray->GetAt(5));
strVal.Empty();
strVal.Format(_T("%.3f"),fVal);
szTARArray->Add(strVal);
}
void CSaveInIP::Wenner_Schlumberger_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
if (szSRCArray->GetSize()<6)
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("数据格式错误在Wenner_Schlumberger"));
else
MessageBoxEx(NULL, _T("Data format error in Wenner_Schlumberger!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return;
}
szTARArray->RemoveAll();
float fVal = 0;
CString strVal = _T("");
//第一列A点的位置
fVal = 0.5*(atof(szSRCArray->GetAt(2)) + atof(szSRCArray->GetAt(3)))-1;
strVal.Format(_T("%.2f"), m_fPoleDistance*fVal);
szTARArray->Add(strVal);
//第二列最小电极间距
strVal.Empty();
strVal.Format(_T("%.2f"), m_fPoleDistance*(atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2))));
szTARArray->Add(strVal);
//第三列间隔系数=n/x
fVal = (atof(szSRCArray->GetAt(2)) - atof(szSRCArray->GetAt(0))) / (atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)));
strVal.Empty();
strVal.Format(_T("%.5f"), fVal);
szTARArray->Add(strVal);
//第四列RO的值
fVal = atof(szSRCArray->GetAt(4));
strVal.Empty();
strVal.Format(_T("%.2f"),fVal);
szTARArray->Add(strVal);
//第五列视电阻率的值
fVal = atof(szSRCArray->GetAt(5));
strVal.Empty();
strVal.Format(_T("%.4f"),fVal);
szTARArray->Add(strVal);
}
void CSaveInIP::AMN_ARRAY_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
if (szSRCArray->GetSize()<6)
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("数据格式错误在A_M_array"));
else
MessageBoxEx(NULL, _T("Data format error in A_M_array!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return;
}
szTARArray->RemoveAll();
float fVal = 0;
CString strVal = _T("");
//第一列A点的位置
fVal = atof(szSRCArray->GetAt(2)) - 1;
strVal.Format(_T("%.2f"), m_fPoleDistance*fVal);
szTARArray->Add(strVal);
//第二列AM之间的电极间距
strVal.Empty();
strVal.Format(_T("%.2f"), m_fPoleDistance*(atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2))));
szTARArray->Add(strVal);
//第三列AM/MN
fVal = (atof(szSRCArray->GetAt(2)) - atof(szSRCArray->GetAt(0))) / (atof(szSRCArray->GetAt(3)) - atof(szSRCArray->GetAt(2)));
strVal.Empty();
strVal.Format(_T("%.5f"), fVal);
szTARArray->Add(strVal);
//第四列RO的值
fVal = atof(szSRCArray->GetAt(4));
strVal.Empty();
strVal.Format(_T("%.2f"),fVal);
szTARArray->Add(strVal);
//第五列视电阻率
fVal = atof(szSRCArray->GetAt(5));
strVal.Empty();
strVal.Format(_T("%.4f"),fVal);
szTARArray->Add(strVal);
}
void CSaveInIP::A_M_ARRAY_2D(CStringArray *szSRCArray, CStringArray *szTARArray)
{
if (szSRCArray->GetSize()<6)
{
if (LANG_ZHCN == g_iUILanguage)
AfxMessageBox(_T("数据格式错误在A_M_array"));
else
MessageBoxEx(NULL, _T("Data format error in A_M_array!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
return;
}
szTARArray->RemoveAll();
float fVal = 0;
CString strVal = _T("");
//第一列AM中点的位置
fVal = 0.5*(atof(szSRCArray->GetAt(2))+atof(szSRCArray->GetAt(0)))-1;
strVal.Format(_T("%.2f"), fVal*m_fPoleDistance);
szTARArray->Add(strVal);
//第二列AM之间的电极间距
strVal.Empty();
strVal.Format(_T("%.2f"), m_fPoleDistance*(atof(szSRCArray->GetAt(2)) - atof(szSRCArray->GetAt(0))));
szTARArray->Add(strVal);
//第三列RO的值
fVal = atof(szSRCArray->GetAt(4));
strVal.Empty();
strVal.Format(_T("%.5f"),fVal);
szTARArray->Add(strVal);
//第四列视电阻率的值
fVal = atof(szSRCArray->GetAt(5));
strVal.Empty();
strVal.Format(_T("%.4f"),fVal);
szTARArray->Add(strVal);
}
void CSaveInIP::SetMidGardientInfo(float fAPosX, float fAPosY, float fABDistance, float fMinAMDistance)
{
m_fAPosX = fAPosX;
m_fAPosY = fAPosY;
m_fABDistance = fABDistance;
m_fMinAMDistance = fMinAMDistance;
}