📄 controlwnd.cpp
字号:
// ControlWnd.cpp : implementation file
//
#include "stdafx.h"
#include "Smooth.h"
#include <math.h>
#include "ControlWnd.h"
#include "LogCurve.h"
#include "DlgInput.h"
#include "DlgSelCurvers.h"
#include "DlgInputPar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define ECF(x) (x)*(x)
/////////////////////////////////////////////////////////////////////////////
// CControlWnd
extern CWellHead wh;
extern int nCurId;
extern BOOL flag;
extern int Lmin,Rmax;
IMPLEMENT_DYNCREATE(CControlWnd, CFormView)
CControlWnd::CControlWnd()
: CFormView(CControlWnd::IDD)
{
//{{AFX_DATA_INIT(CControlWnd)
m_strCurNm = _T("");
m_fEndDep = 0.0f;
m_strFileName = _T("");
m_nsmoothNumPoint = 0;
m_fStDep = 0.0f;
m_nTypeStyle = -1;
//}}AFX_DATA_INIT
// m_nTypeStyle=0;
}
CControlWnd::~CControlWnd()
{
}
void CControlWnd::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CControlWnd)
DDX_Control(pDX, ID_FILE_OPEN, m_FileOpen);
DDX_Control(pDX, IDC_CMB_CURNM, m_cmbCurNm);
DDX_CBString(pDX, IDC_CMB_CURNM, m_strCurNm);
DDX_Text(pDX, IDC_EDT_ENDDEP, m_fEndDep);
DDX_Text(pDX, IDC_EDT_FLNM, m_strFileName);
DDX_Text(pDX, IDC_EDT_NUMPOINT, m_nsmoothNumPoint);
DDX_Text(pDX, IDC_EDT_STDEP, m_fStDep);
DDX_Radio(pDX, IDC_RADIO1, m_nTypeStyle);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CControlWnd, CFormView)
//{{AFX_MSG_MAP(CControlWnd)
ON_BN_CLICKED(ID_FILE_OPEN, OnFileOpen)
ON_BN_CLICKED(ID_FILE_SAVE, OnFileSave)
ON_BN_CLICKED(IDC_BTN_QUIT, OnBtnQuit)
ON_BN_CLICKED(IDC_BTN_OK, OnBtnOk)
ON_CBN_SELCHANGE(IDC_CMB_CURNM, OnSelchangeCmbCurnm)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CControlWnd diagnostics
#ifdef _DEBUG
void CControlWnd::AssertValid() const
{
CFormView::AssertValid();
}
void CControlWnd::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CControlWnd message handlers
void CControlWnd::OnFileOpen()
{
// TODO: Add your control notification handler code here
CString strFileName;
BOOL flag;
CFileDialog dlg(TRUE, _T("DATA文件"), NULL,
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
_T("DATA文件(*.dat)|*.dat|LA 文件(*.la)|*.LA|所有文件(*.*)|*.*||"));
char lpszTitle[]={"选择测井数据文件"};
dlg.m_ofn.lpstrTitle=lpszTitle;
if (dlg.DoModal() != IDOK)
return ; // stay with old data file
strFileName = dlg.GetPathName();
wh.FileName.Format("%s",strFileName);
if(strFileName.Right(3) == _T("dat") || strFileName.Right(3) == _T("DAT"))
{
//读文本文件
flag=ReadDataFile(strFileName);
}
if(strFileName.Right(2) == _T("la") || strFileName.Right(2) == _T("LA"))
{
//读LA文件
flag=ReadLaFile(strFileName);
}
if(!flag) //读文件失败
exit(0);
//初始化必要信息
wh.tnNumCur=wh.nNumCur;
wh.dispSTDEP=wh.STDEP ;
wh.nStPoint=0;
wh.dispENDDEP =wh.ENDDEP;
wh.nEndPoint=wh.nTotalNumPoint;
wh.bWell=true;
flag=false;
wh.InitWellPage();
m_pFr->GetActiveDocument()->UpdateAllViews(NULL);
//根据数据设置对话框
m_strFileName=strFileName;
m_cmbCurNm.Clear();
for(int i=m_cmbCurNm.GetCount();i>=0;i--)
m_cmbCurNm.DeleteString(i);
for(int c=1;c<=wh.nNumCur;c++)
m_cmbCurNm.AddString(wh.Curve[c].strCurName);
m_fEndDep =wh.ENDDEP;
m_fStDep =wh.STDEP ;
m_nsmoothNumPoint =5;
m_nTypeStyle=0;
UpdateData (FALSE);
m_cmbCurNm.SetCurSel(1);
}
void CControlWnd::OnBtnOk()
{
// TODO: Add your control notification handler code here
CString str;
int i;
if(!wh.bWell)
{
AfxMessageBox("请先选择文件名读入测井数据!");
m_FileOpen.SetFocus();
return;
}
int nEdited=nCurId;
/* for(int i=1;i<=wh.nNumCur;i++)
{
if(wh.Curve[i].flagEditd)
nEdited=i;
}
if(nEdited>0)*/
if(nEdited>0)
{
str="是否保存对曲线"+ wh.Curve[nEdited].strCurName + "的修改?";
int nResult = MessageBox(str,"提示信息",MB_ICONINFORMATION|MB_YESNOCANCEL);
int kk;
switch(nResult)
{
case IDNO:
nCurId=0;
wh.Curve[nEdited].flagEditd=false;
wh.Curve[nEdited].tmpnID= nEdited;
for(kk=0;kk<wh.nTotalNumPoint;kk++)
wh.pLogData[kk][nEdited]=wh.pLogData[kk][wh.tnNumCur];
break;
case IDYES:
nCurId=0;
wh.Curve[nEdited].flagEditd=false;
wh.Curve[nEdited].tmpnID= nEdited;
break;
default://IDCANCEL
return;
}
}
int nCur,nStPoint,nEndPoint; //需要进行平滑的曲线号
UpdateData (TRUE);
// wh.dispSTDEP = m_fStDep;
// wh.dispENDDEP = m_fEndDep ;
if (m_fEndDep>wh.ENDDEP || m_fStDep<wh.STDEP )
{
CString str;
str.Format("%10.3f ~ %10.3f",wh.STDEP,wh.ENDDEP ) ;
str="曲线深度段超出测量井段范围:"+str+"\n";
AfxMessageBox(str);
return;
}
//进行平滑处理
for(i=1;i<=wh.nNumCur;i++)
{
if(wh.Curve[i].strCurName.Compare(m_strCurNm)==0)
nCur=i;
}
nCurId=nCur;
//数据临时性处理:首先将该曲线数据复制一份,存在空白曲线位置
//处理时只是处理原来的曲线数据,保存结果时直接保存处理过的数据,放弃处理结果时
//只需要从复制的数据中恢复即可。
if(!wh.Curve[nCur].flagEditd) //第一次编辑,需要重新分配空间
{
int tmpCurID=wh.Curve[nCur].GetnID();
wh.tnNumCur=wh.nNumCur+1;
wh.Curve[tmpCurID].flagEditd=true;
wh.Curve[nCur].tmpnID= wh.tnNumCur;
wh.Curve[tmpCurID].SetnId(wh.tnNumCur);
wh.Curve[wh.tnNumCur].strCurName.Format("%s",wh.Curve[nCur].strCurName);
wh.Curve[wh.tnNumCur].strCurName += "S";
for(int kk=0;kk<wh.nTotalNumPoint;kk++)
wh.pLogData[kk][wh.tnNumCur]=wh.pLogData[kk][tmpCurID];
}
int m=m_nsmoothNumPoint;
nStPoint=(m_fStDep-wh.STDEP)/wh.RLEV;
nEndPoint=(m_fEndDep-wh.STDEP)/wh.RLEV+1;
//确定左右边界
float L,R;
L=R=wh.pLogData[0][nCurId];
for(i=nStPoint;i<=nEndPoint;i++)
{
if (L>wh.pLogData[i][nCurId])
L=wh.pLogData[i][nCurId];
if (R<wh.pLogData[i][nCurId])
R=wh.pLogData[i][nCurId];
}
Lmin=L-(R-L)/8;
Rmax=R+(R-L)/8+1;
CDlgInput dlg0;
CDlgSelCurvers dlg3;
CDlgInputPar dlg4;
switch(m_nTypeStyle)
{
case 0:
if(dlg0.DoModal()==IDOK)
DCCXLFC(nCur,nStPoint,nEndPoint,m,dlg0.m_Value);
break;
case 1:
if(dlg4.DoModal()==IDOK)
CNCYFFC(nCur,nStPoint,nEndPoint,dlg4.m_inputB);
break;
// case 2: JQHDPH(nCur,nStPoint,nEndPoint,m);break;
// case 3: JDJZPH(nCur,nStPoint,nEndPoint,m);break;
default:JZFCFC(nCur,nStPoint,nEndPoint,m);break;
}
AfxMessageBox("完成曲线分层处理!");
flag=true;
//pMyView->UpdateData(TRUE);
m_pFr->GetActiveDocument()->UpdateAllViews(NULL);
}
void CControlWnd::OnFileSave()
{
// TODO: Add your control notification handler code here
wh.Curve[nCurId].flagEditd=false;
wh.Curve[nCurId].tmpnID= nCurId;
int i,j,k;
CString tmpStr;
//文本格式文件
/* m_strFileName="BED.dat";
CFile ff(m_strFileName,CFile::modeCreate | CFile::modeWrite);
tmpStr=wh.WellName+"BED\n";
ff.Write(tmpStr,tmpStr.GetLength());//井名
tmpStr.Format("%3d\n",wh.nNumCur+2);
ff.Write(tmpStr,tmpStr.GetLength()); //曲线条数
tmpStr.Format("%8.3f,%8.3f\n",1,float(nBed)); //起止深度信息
ff.Write(tmpStr,tmpStr.GetLength());
tmpStr.Format("%8.3f\n",float(1)); //采样间隔
ff.Write(tmpStr,tmpStr.GetLength());
ff.Write("END\n\n",5);
//曲线名称
tmpStr.Format("%s"," #DEPTH DEP1 DEP2 ");
ff.Write(tmpStr,tmpStr.GetLength()); //#DEPTH
for(i=1;i<=wh.nNumCur;i++)
{
tmpStr.Format("%15s",wh.Curve[i].strCurName) ;
ff.Write(tmpStr,15);
}
ff.Write("\n",1);
//测井数据
for(k=0;k<nBed;k++)
{
tmpStr.Format("%8.3f %8.3f %8.3f",float(k),wh.pLogData[pBed[k]][0],wh.pLogData[pBed[k+1]][0] );
ff.Write(tmpStr,tmpStr.GetLength() ); //深度
for(i=1;i<=wh.nNumCur;i++)
{
tmpStr.Format("%14.5f ",wh.pLogData[pBed[k]][i+wh.nNumCur]) ;
ff.Write(tmpStr,tmpStr.GetLength() );
}
ff.Write("\n",1);
}
ff.Close();*/
for(i=1;i<=wh.nNumCur;i++)
{
tmpStr=wh.Curve[i].strCurName+"Z";
wh.Curve[wh.nNumCur+i].strCurName.Format("%s",tmpStr);
}
wh.nNumCur*=2;
//文本格式文件
m_strFileName=wh.FileName;
CFile f(m_strFileName,CFile::modeCreate | CFile::modeWrite);
f.Write(wh.WellName,wh.WellName.GetLength());
f.Write("\n",1); //井名
tmpStr.Format("%3d\n",wh.nNumCur);
f.Write(tmpStr,4); //曲线条数
tmpStr.Format("%8.3f,%8.3f\n",wh.STDEP,wh.ENDDEP); //起止深度信息
f.Write(tmpStr,18);
tmpStr.Format("%8.3f\n",wh.RLEV); //采样间隔
f.Write(tmpStr,9);
f.Write("END\n\n",5);
//曲线名称
tmpStr.Format("%9s","#DEPTH");
f.Write(tmpStr,8); //#DEPTH
for(i=1;i<=wh.nNumCur;i++)
{
tmpStr.Format("%15s",wh.Curve[i].strCurName) ;
f.Write(tmpStr,15);
}
f.Write("\n",1);
//测井数据
for(k=0;k<wh.nTotalNumPoint;k++)
{
tmpStr.Format("%8.3f ",wh.pLogData[k][0]);
f.Write(tmpStr,9); //深度
for(i=1;i<=wh.nNumCur;i++)
{
tmpStr.Format("%14.5f ",wh.pLogData[k][i]) ;
f.Write(tmpStr,15);
}
f.Write("\n",1);
}
f.Close();
AfxMessageBox("文保存完成!");
}
//读取文本文件
BOOL CControlWnd::ReadDataFile(CString strFileName)
{
FILE *fp;//*fp1,*fp2;
if(strFileName.Right(3) == _T("dat") || strFileName.Right(3) == _T("DAT")) //读文本文件
{
if((fp=fopen(strFileName,"r"))==NULL)
{
CString str;
str="文件"+strFileName +"打开错误";
AfxMessageBox(str);
return false;
}
CString tmpStr;
int i=0,k;
fscanf(fp,"%s",tmpStr);//井名
wh.WellName.Format("%s",tmpStr);
fscanf(fp,"%d",&wh.nNumCur);//测井曲线条数
fscanf(fp,"%f,%f",&wh.STDEP,&wh.ENDDEP);//起始深度//终止深度
fscanf(fp,"%f",&wh.RLEV);//采样间隔
fscanf(fp,"%s",tmpStr);//其它信息(end)
for(i=0;i<=wh.nNumCur;i++)//读曲线名
{
fscanf(fp,"%s",tmpStr);
wh.Curve[i].strCurName.Format("%s",tmpStr);
wh.Curve[i].strOthCurName.Format("%s",tmpStr);
wh.Curve[i].StrCurDanwei.Format("%s","UNKNOW");
wh.Curve[i].SetnId(i);
}
//分配内存空间并读取测井数据
wh.nTotalNumPoint=(long)((wh.ENDDEP -wh.STDEP )/wh.RLEV+1.1);
i=0;
if(wh.pLogData!=NULL)
{
delete []wh.pLogData;
wh.pLogData =NULL;
}
wh.pLogData=new float[wh.nTotalNumPoint][81];
for(k=0;k<wh.nTotalNumPoint;k++)
for(i=0;i<wh.nNumCur+1;i++)
{
fscanf(fp,"%f",&wh.pLogData[k][i]);
}
fclose(fp);
}
return true;
}
//读取LA文件
BOOL CControlWnd::ReadLaFile(CString strLaFileName)
{
CString tmpStr;
int i,j,k,f;
char tmp[200];
float ECC,af;
char ICO[80],IWELL[80],LOGNAM[80][4];
CFile fLa(strLaFileName,CFile::modeRead|CFile::typeBinary);
fLa.Read(&ECC,4);
fLa.Read(ICO,80);
fLa.Read(IWELL,80);
// wh.WellName.Format("%s",IWELL);
i=fLa.GetPosition();
fLa.Read(&wh.nNumCur,2);
i=fLa.GetPosition();//166
short afd;
i=sizeof(afd);
fLa.Read(&afd,2);
// fLa.Read(tmp,2);
i=fLa.GetPosition();//168
fLa.Read(LOGNAM,80);
i=fLa.GetPosition();//248
fLa.Read(&wh.STDEP,4);
i=fLa.GetPosition();//252
fLa.Read(&wh.ENDDEP,4);
fLa.Read(&wh.RLEV,4 );
fLa.Read(tmp,4);
fLa.Read(&f,4);
fLa.Read(LOGNAM[20],240);
i=fLa.GetPosition();//508
fLa.Read(&af,4);
i=fLa.GetPosition();//252
//为曲线名赋值
for(i=1;i<=wh.nNumCur;i++)
{
tmpStr.Format("%s","asdf");
for(j=0;j<4;j++)
{
if(LOGNAM[i-1][j]!=' ')
tmpStr.SetAt(j,LOGNAM[i-1][j]);
else
tmpStr.SetAt(j,'\0');
}
wh.Curve[i].strCurName.Format("%s",tmpStr) ;
wh.Curve[i].strOthCurName.Format(wh.Curve[i].strCurName);
wh.Curve[i].SetnId(i) ;
}
wh.nTotalNumPoint=(long)(((wh.ENDDEP -wh.STDEP )/wh.RLEV)+1.01);
if(wh.pLogData!=NULL)
{
delete []wh.pLogData;
wh.pLogData =NULL;
}
wh.pLogData=new float[wh.nTotalNumPoint][81];
int t=wh.nTotalNumPoint*(wh.nNumCur+1);
//读取实际测井数据
//整个数据块
i=fLa.GetPosition();
fLa.Seek(512,CFile::begin);
i=fLa.GetPosition();
for(k=0;k<wh.nTotalNumPoint/64;k++) //数据块的循环
{
for(i=1;i<=80;i++ ) //曲线循环
{
for(j=0;j<64;j++) //每个数据块内有64个采样点
{
fLa.Read(&wh.pLogData[k*64+j][i],4);
}
}
}
//最后部分数据块
for(i=1;i<=80;i++ ) //曲线循环
{
for(j=0;j<wh.nTotalNumPoint%64;j++) //该数据块内有64个采样点中的有用采样点
{
fLa.Read(&wh.pLogData[k*64+j][i],4);
}
for(j=j;j<64;j++) //该数据块内有64个采样点中的空闲采样点
fLa.Read(&af,4);
}
fLa.Close();
//为测井数据深度赋值
for(i=0;i<wh.nTotalNumPoint;i++ )
wh.pLogData[i][0]=wh.STDEP+i*wh.RLEV;
return true;
}
void CControlWnd::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
m_pFr = (CMainFrame*)AfxGetApp()->m_pMainWnd;
}
void CControlWnd::OnBtnQuit()
{
// TODO: Add your control notification handler code here
CString str="是否保存对曲线"+ wh.Curve[nCurId].strCurName + "的修改?";
int nResult = MessageBox(str,"提示信息",MB_ICONINFORMATION|MB_YESNOCANCEL);
int kk;
switch(nResult)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -