⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controlwnd.cpp

📁 是有关石油物理测井曲线的分层方法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -