📄 newgraph.cpp
字号:
// NewGraph.cpp : implementation file
//
#include "stdafx.h"
#include "CVenus.h"
#include "MainFrm.h"
#include "NewGraph.h"
#include "ChildFrm.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNewGraph
IMPLEMENT_DYNCREATE(CNewGraph, CFormView)
CNewGraph::CNewGraph()
: CFormView(CNewGraph::IDD)
{
//{{AFX_DATA_INIT(CNewGraph)
//}}AFX_DATA_INIT
// TODO: add construction code here
m_iX = 28;
m_iY = 220;
m_iXStart = 50;
m_iYStart = 50;
m_color[0] = RGB(0,0,0);
m_color[1] = RGB(0,255,0);
m_color[2] = RGB(0,0,255);
m_color[3] = RGB(255,0,255);
m_color[4] = RGB(0,0,160);
m_color[5] = RGB(0,255,255);
m_color[6] = RGB(0,128,0);
m_color[7] = RGB(128,0,0);
m_color[8] = RGB(0,64,0);
m_color[9] = RGB(0,128,192);
m_color[10] = RGB(64,128,128);
m_color[11] = RGB(196,196,0);
m_color[12] = RGB(255,128,128);
m_color[13] = RGB(128,0,64);
m_color[14] = RGB(244,100,175);
m_color[15] = RGB(175,244,100);
}
CNewGraph::~CNewGraph()
{
}
void CNewGraph::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewGraph)
DDX_Control(pDX, IDC_USERBITMAPCTRL, m_ctrlPic);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNewGraph, CFormView)
ON_WM_CONTEXTMENU()
//{{AFX_MSG_MAP(CNewGraph)
ON_WM_CREATE()
ON_COMMAND(IDM_SPD_BITMP, OnSpdBitmp)
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNewGraph diagnostics
#ifdef _DEBUG
void CNewGraph::AssertValid() const
{
CFormView::AssertValid();
}
void CNewGraph::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CNewGraph message handlers
int CNewGraph::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CMainFrame* wnd = (CMainFrame*)AfxGetMainWnd();
CString cstrProjectName;
if(wnd->m_structWellInfo.bWellState == TRUE) //油井
{
switch(wnd->m_iPaint)
{
case 1: //孔深/孔密
cstrProjectName = "射孔敏感度分析(产率图)-孔深/孔密";
break;
case 2: //孔深/相位角
cstrProjectName = "射孔敏感度分析(产率图)-孔深/相位角";
break;
case 3: //非均质性/相位角
cstrProjectName = "射孔敏感度分析(产率图)-非均质性/相位角";
break;
case 4: //孔深/孔径
cstrProjectName = "射孔敏感度分析(产率图)-孔深/孔径";
break;
case 5: //孔深/压实厚度
cstrProjectName = "射孔敏感度分析(产率图)-孔深/压实厚度";
break;
case 6: //孔深/压实程度
cstrProjectName = "射孔敏感度分析(产率图)-孔深/压实程度";
break;
case 7: //孔深/污染深度
cstrProjectName = "射孔敏感度分析(产率图)-孔深/污染深度";
break;
case 8: //污染深度/实际孔深
cstrProjectName = "射孔敏感度分析(产率图)-污染深度/实际孔深";
break;
case 9: //孔深/污染程度
cstrProjectName = "射孔敏感度分析(产率图)-孔深/污染程度";
break;
case 10: //孔深/非均质性
cstrProjectName = "射孔敏感度分析(产率图)-孔深/非均质性";
break;
}
}
else //气井
{
switch(wnd->m_iPaint)
{
case 1: //孔深/孔密
cstrProjectName = "射孔敏感度分析(产率图)-孔深/孔密";
break;
case 2: //相位
cstrProjectName = "射孔敏感度分析(产率图)-孔深/相位";
break;
case 3: //孔径
cstrProjectName = "射孔敏感度分析(产率图)-孔深/孔径";
break;
case 4: //生产压差
cstrProjectName = "射孔敏感度分析(产率图)-孔深/生产压差";
break;
case 5: //压实程度
cstrProjectName = "射孔敏感度分析(产率图)-孔深/压实程度";
break;
case 6: //地层渗透率
cstrProjectName = "射孔敏感度分析(产率图)-孔深/地层渗透率";
break;
case 7: //污染程度
cstrProjectName = "射孔敏感度分析(产率图)-孔深/污染程度";
break;
case 8: //非均质性
cstrProjectName = "射孔敏感度分析(产率图)-孔深/非均质性";
break;
}
}
GetParentFrame()->SetWindowText(cstrProjectName);
m_iX = (int)(m_iX*wnd->m_fScale);
m_iY = (int)(m_iY*wnd->m_fScale);
m_fScale = wnd->m_fScale;
CString cstrTemp;
int iTemp;
if(wnd->m_structWellInfo.bWellState == TRUE) //油井
{
cstrTemp = wnd->m_structOilShotForecast.strModel ;
for(iTemp=0;iTemp<wnd->m_structBDTTable.lCount;iTemp++)
{
if(cstrTemp.Compare(wnd->m_structSDT[iTemp].strModel)==0)
{
m_fKS = wnd->m_structSDT[iTemp].fShotDepth ;
//m_fPKS = wnd->m_structSDT[iTemp].fShotDepth * wnd->m_structTTPResult.fPP[iTemp];
m_fPKS = wnd->m_structTTPResult.fPDepth[iTemp];
m_fKM = wnd->m_structOilShotForecast.fShotDen ;
m_fKJ = wnd->m_structSDT[iTemp].fDiameter ;
m_fXW1 = wnd->m_structOilShotForecast.fShotPhasic ;
m_fYH = wnd->m_structSDT[iTemp].fPressDeep ;
m_fWH = wnd->m_structBDTTable.fDrillPolluteDepth ;
m_fYC = wnd->m_structSDT[iTemp].fPressLong ;
m_fWC = wnd->m_structBDTTable.fDrillPollutePercent ;
m_fKZR = wnd->m_structBDTTable.fStratumHeterosphere ;
m_fJBJ = (float)(wnd->m_structBDTTable.fWellRadius * 1000);
m_fDP = wnd->m_structBDTTable.fProducePressDiff ;
m_fPK = (float)(wnd->m_structBDTTable.fStratumFilterPercent * 1000);
m_fPE = wnd->m_structBDTTable.fStratumAverPress ;
m_fXW[0] = (float)0;
m_fXW[1] = (float)90;
m_fXW[2] = (float)120;
m_fXW[3] = (float)180;
m_fXW[4] = (float)60;
break;
}
}
}
else //气井
{
cstrTemp = wnd->m_structGasShotForecast.strModel ;
for(iTemp=0;iTemp<wnd->m_structBDTTable.lCount;iTemp++)
{
if(cstrTemp.Compare(wnd->m_structSDT[iTemp].strModel)==0)
{
m_fKS = wnd->m_structSDT[iTemp].fShotDepth ;
//m_fPKS = wnd->m_structSDT[iTemp].fShotDepth * wnd->m_structTTPResult.fPP[iTemp];
m_fPKS = wnd->m_structTTPResult.fPDepth[iTemp];
m_fKM = wnd->m_structGasShotForecast.fShotDen ;
m_fKJ = wnd->m_structSDT[iTemp].fDiameter ;
m_fXW1 = wnd->m_structGasShotForecast.fShotPhasic ;
m_fYH = wnd->m_structSDT[iTemp].fPressDeep ;
m_fWH = wnd->m_structBDTTable.fDrillPolluteDepth ;
m_fYC = wnd->m_structSDT[iTemp].fPressLong ;
m_fWC = wnd->m_structBDTTable.fDrillPollutePercent ;
m_fKZR = wnd->m_structBDTTable.fStratumHeterosphere ;
m_fJBJ = (float)(wnd->m_structBDTTable.fWellRadius * 1000);
m_fDP = wnd->m_structBDTTable.fProducePressDiff ;
m_fPK = (float)(wnd->m_structBDTTable.fStratumFilterPercent * 1000);
m_fPE = wnd->m_structBDTTable.fStratumAverPress ;
m_fXW[0] = (float)0;
m_fXW[1] = (float)90;
m_fXW[2] = (float)120;
m_fXW[3] = (float)180;
m_fXW[4] = (float)60;
break;
}
}
}
return 0;
}
float CNewGraph::fnprwOil1(float ks, float km, float kj, float xw, float jbj, float kzr, float yh, float yc, float wh, float wc)
{
return (float)(-0.25+0.00148*ks-1.23E-06*pow(ks,2)+0.00958*km-
0.0000998*pow(km,2)-0.00467*km*(log(kzr)/log(10))+0.0178*kj-
0.000296*pow(kj,2)+0.00195*xw-0.00001*pow(xw,2));
}
float CNewGraph::fnprwOil2(float ks, float km, float kj, float xw, float jbj, float kzr, float yh, float yc, float wh, float wc)
{
return (float)(fnprwOil1(ks,km,kj,xw,jbj,kzr,yh,yc,wh,wc)-2*0.000828*
xw*(log(kzr)/log(10))+0.4*(log(kzr)/log(10))+0.3488*yc-0.1745*
pow(yc,2)+0.69*wc-0.35*pow(wc,2)-0.00778*yh);
}
float CNewGraph::fnprwOil(float ks, float km, float kj, float xw, float jbj, float kzr, float yh, float yc, float wh, float wc)
{
return (float)(fnprwOil2(ks,km,kj,xw,jbj,kzr,yh,yc,wh,wc)+0.000156*
pow(yh,2)-0.000452*wh+2.05E-07*pow(wh,2)+0.319*kzr-0.103*
pow(kzr,2)-0.0009512*jbj+2.378E-06*pow(jbj,2));
}
float CNewGraph::fnprcOil1(float ks, float km, float kj, float xw, float jbj, float kzr, float yh, float yc, float wh, float wc)
{
return (float)(-0.25+0.00191*ks-1.36E-06*pow(ks,2)+0.01665*km-
0.000173*pow(km,2)-0.00856*km*(log(kzr)/log(10))+0.0201*kj-
0.000335*pow(kj,2)+0.00211*xw-0.0000108*pow(xw,2));
}
float CNewGraph::fnprcOil2(float ks, float km, float kj, float xw, float jbj, float kzr, float yh, float yc, float wh, float wc)
{
return (float)(fnprcOil1(ks,km,kj,xw,jbj,kzr,yh,yc,wh,wc)-2*0.000887*
xw*(log(kzr)/log(10))+0.5*(log(kzr)/log(10))+0.512*yc-
0.253*pow(yc,2)+0.3315*wc-0.168*pow(wc,2)-0.00963*yh);
}
float CNewGraph::fnprcOil(float ks, float km, float kj, float xw, float jbj, float kzr, float yh, float yc, float wh, float wc)
{
return (float)(fnprcOil2(ks,km,kj,xw,jbj,kzr,yh,yc,wh,wc)+
0.000193*pow(yh,2)-0.000841*wh+7.14E-07*pow(wh,2)+
0.406*kzr-0.135*pow(kzr,2)-0.0009736*jbj+2.43E-06*
pow(jbj,2));
}
float CNewGraph::fnprlOil1(float ks, float km, float kj, float xw, float jbj, float kzr)
{
return (float)(-0.45+0.00191*ks-1.36*pow(10,-6)*pow(ks,2)+
0.01665*km-0.000173*pow(km,2)-0.00856*km*(log(kzr)/log(10))+
0.0201*kj-0.000335*pow(kj,2)+0.00211*xw-0.0000108*pow(xw,2));
}
float CNewGraph::fnprlOil2(float ks, float km, float kj, float xw, float jbj, float kzr)
{
return (float)(fnprlOil1(ks,km,kj,xw,jbj,kzr)-2*0.000887*xw*(log(kzr)/log(10))+
0.5*(log(kzr)/log(10))+0.512*1-0.253*pow(1,2)+0.3315*1-0.168*pow(1,2)-
0.00963*0);
}
float CNewGraph::fnprlOil(float ks, float km, float kj, float xw, float jbj, float kzr)
{
return (float)(fnprlOil2(ks,km,kj,xw,jbj,kzr)+0.000193*pow(0,2)-
0.000841*0+7.14*pow(10,-7)*pow(0,2)+0.406*kzr-0.135*pow(kzr,2)-
0.0009736*jbj+2.43E-6*pow(jbj,2));
}
float CNewGraph::fnprwGas1(float ks, float km, float kj, float xw, float kzr, float yh, float yc, float wh, float wc)
{
return (float)(0.7158+0.1231*(ks-200)/61.5-0.0126*(yh-13)/2.87+
0.1244*(km-29)/8.609999+0.0599*(yc-0.525)/0.195+8.519999E-02
*(kj-13)/2.87+0.14*(wc-0.525)/0.195-0.0149*(wh-525)/133+
0.0112*(xw-90)/30+0.0467*(kzr-0.505)/0.203);
}
float CNewGraph::fnprwGas2(float ks, float km, float jbj, float yc, float wc, float dp)
{
return (float)(-0.0221*(dp-16)/5.74+0.0559*(jbj-114.3)/15.62+
0.0095*((ks-200)/61.5)*((km-29)/8.609999)+0.0241*((km-29)/
8.609999)*((wc-0.525)/0.195)+0.0106*((yc-0.525)/0.195)*
((wc-0.525)/0.195));
}
float CNewGraph::fnprwGas3(float ks, float km, float xw, float yh, float yc, float dp)
{
return (float)(0.0106*((km-29)/8.609999)*((dp-16)/5.74)-0.0142*
((xw-90)/30)*((dp-16)/5.74)-0.0126*pow((ks-200)/61.5,2)+
0.0009*pow((yh-13)/2.87,2)-0.0144*pow((km-29)/8.609999,2)-
0.012*pow((yc-0.525)/0.195,2));
}
float CNewGraph::fnprwGas4(float kj, float xw, float jbj, float kzr, float wh, float pk, float dp)
{
return (float)(0.0104*pow((wh-525)/133,2)-0.0092*pow((kzr-0.505)/0.203,2)+
0.0101*pow((pk-100)/41,2)+0.0187*pow((dp-16)/5.74,2)+0.0116*pow((jbj-114.3)/15.62,2)-
0.0027*pow((xw-90)/30,2)-0.0074*pow((kj-13)/2.87,2));
}
float CNewGraph::fnprwGas5(float ks, float xw, float kzr, float wc, float dp)
{
return (float)(0.0159*((xw-90)/30)*((kzr-0.505)/0.203)-0.0101*
((ks-200)/61.5)*((dp-16)/5.74)-0.0219*pow((wc-0.525)/0.195,2));
}
float CNewGraph::fnprcGas1(float ks, float km, float kj, float xw, float kzr, float yh, float yc, float wh, float wc)
{
return (float)(1.2575+0.0435*(ks-425)/71.76-0.0223*(yh-13)/2.87+
0.1973*(km-29)/8.609999+0.0281*(yc-0.525)/0.195+0.1873*(kj-13)/2.87+
0.0544*(wc-0.525)/0.195-0.0193*(wh-200)/82+0.0255*(xw-90)/30+0.0515*
(kzr-0.505)/0.203);
}
float CNewGraph::fnprcGas2(float ks, float km, float xw, float jbj, float kzr, float wh, float wc)
{
return (float)(0.0485*(jbj-114.3)/15.62+0.0111*((ks-425)/71.76)*
((km-29)/8.609999)+0.0201*((wc-0.525)/0.195)*((wh-200)/82)+
0.0211*((xw-90)/30)*((kzr-0.505)/0.203)-0.0069*pow((ks-425)/71.67,2));
}
float CNewGraph::fnprcGas3(float km, float kj, float xw, float kzr, float yc, float wh, float wc)
{
return (float)(-0.0255*pow((km-29)/8.609999,2)-0.0057*
pow((yc-0.525)/0.195,2)-9.100001E-03*pow((kj-13)/2.87,2)-
0.0102*pow((wc-0.525)/0.195,2)+0.0024*pow((wh-200)/82,2)-
0.0177*pow((xw-90)/30,2)-0.0102*pow((kzr-0.505)/0.203,2));
}
float CNewGraph::fnprcGas4(float yh, float jbj, float pk, float dp)
{
return (float)(0.0028*pow((jbj-114.3)/15.62,2)+0.01*
pow((dp-16)/5.74,2)+0.0338*pow((pk-100)/41,2)+0.0028*
pow((yh-13)/2.87,2)-0.0243*(pk-100)/41-0.0373*(dp-16)/5.74);
}
void CNewGraph::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
CMainFrame* wnd = (CMainFrame*)AfxGetMainWnd();
m_ctrlPic.PicCls ();
CRect rc;
GetClientRect(&rc);
TRACE("%d, %d\n", rc.Width(), rc.Height());
m_fScale = 1;
if(rc.Width() > 600)
m_iX = 28*rc.Width()/400;
else if(rc.Width() > 500)
m_iX = 28*rc.Width()/430;
else
m_iX = 28*rc.Width()/450;
if(rc.Height() > 500)
m_iY = 220*rc.Height()/300;
else if(rc.Height() > 400)
m_iY = 220*rc.Height()/320;
else if(rc.Height() > 350)
m_iY = 220*rc.Height()/350;
else if(rc.Height() > 300)
m_iY = 220*rc.Height()/420;
else
m_iY = 220*rc.Height()/500;
/* CSize sizeTotal;
sizeTotal.cx = rc.Width();
sizeTotal.cy = rc.Height();
SetScrollSizes(MM_TEXT, sizeTotal);
*/
m_ctrlPic.SetWindowPos(this, rc.left, rc.top, rc.Width(), rc.Height(), NULL);
if(wnd->m_structWellInfo.bWellState == TRUE) //油井
{
switch(wnd->m_iPaint)
{
case 1: //孔深/孔密
DrawOilKSKM();
break;
case 2: //孔深/相位角
DrawOilKSXW();
break;
case 3: //非均质性/相位角
DrawOilKZRXW();
break;
case 4: //孔深/孔径
DrawOilKSKJ();
break;
case 5: //孔深/压实厚度
DrawOilKSYH();
break;
case 6: //孔深/压实程度
DrawOilKSYC();
break;
case 7: //孔深/污染深度
DrawOilKSWH();
break;
case 8: //污染深度/实际孔深
DrawOilWHFKS();
break;
case 9: //孔深/污染程度
DrawOilKSWC();
break;
case 10: //孔深/非均质性
DrawOilKSKZR();
break;
}
}
else //气井
{
switch(wnd->m_iPaint)
{
case 1: //孔深/孔密
DrawGasKSKM();
break;
case 2: //相位
DrawGasKSXW();
break;
case 3: //孔径
DrawGasKSKJ();
break;
case 4: //生产压差
DrawGasKSDP();
break;
case 5: //压实程度
DrawGasKSYC();
break;
case 6: //地层渗透率
DrawGasKSPK();
break;
case 7: //污染程度
DrawGasKSWC();
break;
case 8: //非均质性
DrawGasKSKZR();
break;
}
}
// m_ctrlPic.UpdateWindow();
}
void CNewGraph::DrawOilKSKM()
{
float m0 = (float)5;
float m1 = (float)0;
float km,ks,kj,xw,jbj,kzr,yh,yc,wh,wc;
kj = m_fKJ ;
xw = m_fXW1 ;
jbj = m_fJBJ ;
kzr = m_fKZR ;
yh = m_fYH ;
yc = m_fYC ;
wh = m_fWH ;
wc = m_fWC ;
float pr2[8][14];
int i,j;
for(i=0;i<8;i++)
{
km = (float)((i+1)*4+4); //8~36
for(j=0;j<13;j++)
{
ks = (float)(j*50); //0~600
if(ks<=wh)
pr2[i][j] = (float)(fnprwOil(ks,km,kj,xw,jbj,kzr,yh,yc,wh,wc)*1.1);
else //pprr?
pr2[i][j] = (float)(fnprcOil(ks,km,kj,xw,jbj,kzr,yh,yc,wh,wc)*1.1);
if(yh==0 && wh==0)
pr2[i][j] = (float)(fnprlOil(ks,km,kj,xw,jbj,kzr)*1.1);
if(pr2[i][j]<0) pr2[i][j] = (float)0;
if(pr2[i][j]>m1) m1 = pr2[i][j]; //Max
if(pr2[i][j]<m0) m0 = pr2[i][j]; //Min
}
}
//
float x1,x2,y1,y2,xMax,xMin,yMax,yMin;
xMin = (float)100000000;
xMax = (float)0;
yMin = (float)100000000;
yMax = (float)0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -