📄 graph.cpp
字号:
// Graph.cpp : implementation file
//
#include "stdafx.h"
#include "CVenus.h"
#include "MainFrm.h"
#include "Graph.h"
#include "ChildFrm.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGraph
IMPLEMENT_DYNCREATE(CGraph, CFormView)
CGraph::CGraph()
: CFormView(CGraph::IDD)
{
//{{AFX_DATA_INIT(CGraph)
//}}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);
}
CGraph::~CGraph()
{
}
void CGraph::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGraph)
DDX_Control(pDX, IDC_USERBITMAPCTRL, m_ctrlPic);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGraph, CFormView)
ON_WM_CONTEXTMENU()
//{{AFX_MSG_MAP(CGraph)
ON_WM_CREATE()
ON_COMMAND(IDM_SPD_BITMP, OnSpdBitmp)
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGraph diagnostics
#ifdef _DEBUG
void CGraph::AssertValid() const
{
CFormView::AssertValid();
}
void CGraph::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGraph message handlers
int CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::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 CGraph::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
CMainFrame* wnd = (CMainFrame*)AfxGetMainWnd();
m_ctrlPic.PicCls ();
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 CGraph::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;
for(i=0;i<8;i++)
{
for(j=0;j<12;j++)
{
x1 = (float)(m_iXStart+j*m_iX);
x2 = (float)(m_iXStart+(j+1)*m_iX);
y1 = (float)(m_iYStart+(m1-pr2[i][j])*m_iY/(m1-m0));
y2 = (float)(m_iYStart+(m1-pr2[i][j+1])*m_iY/(m1-m0));
if(xMin>x1) xMin = x1;
if(xMin>x2) xMin = x2;
if(xMax<x1) xMax = x1;
if(xMax<x2) xMax = x2;
if(yMin>y1) yMin = y1;
if(yMin>y2) yMin = y2;
if(yMax<y1) yMax = y1;
if(yMax<y2) yMax = y2;
}
}
m_ctrlPic.SetWindowPos (this,
10,
20,
(int)(xMax + 50),
(int)(yMax + 70),
SWP_NOMOVE);
CSize sizeTotal;
sizeTotal.cx = (int)(xMax + 80);
sizeTotal.cy = (int)(yMax + 120);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -