// 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& 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 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 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; }