📄 processview.cpp
字号:
// ProcessView.cpp : implementation of the CProcessView class
//
#include "stdafx.h"
#include "Process.h"
#include "MainFrm.h"
#include "ProcessDoc.h"
#include "ProcessView.h"
#include "ProcessData.h"
#include "DlgIDWT.h"
#include "DlgIntensity.h"
#include "DlgKalman.h"
#include "BPNetDlg.h"
#include "Matrix1.h"
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define pi 3.1415926
/////////////////////////////////////////////////////////////////////////////
// CProcessView
IMPLEMENT_DYNCREATE(CProcessView, CScrollView)
BEGIN_MESSAGE_MAP(CProcessView, CScrollView)
//{{AFX_MSG_MAP(CProcessView)
ON_COMMAND(ID_WAVELET_NO1, OnWavelet)
ON_COMMAND(ID_IWAVELET, OnIwavelet)
ON_COMMAND(ID_KALMAN_MOXING1, OnKalmanMoxing1)
ON_COMMAND(ID_FILTER_MEAN, OnFilterMean)
ON_COMMAND(ID_NIHE_YIYUANERCI, OnNiheYiyuanerci)
ON_COMMAND(ID_NIHE_ZHIXIAN, OnNiheZhixian)
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_FILTER_MIDDLE, OnFilterMiddle)
ON_COMMAND(ID_CHECK, OnCheck)
ON_COMMAND(ID_NORMALIZE, OnNormalizeData)
ON_COMMAND(ID_INSERT, OnInsertValue)
ON_COMMAND(ID_INSERT_INCnAZI, OnINSERTINCnAZI)
ON_COMMAND(ID_MANGQV, OnMangqv)
ON_COMMAND(ID_QITA_ZUANSHItoZUANSU, OnZUANSHItoZUANSU)
ON_COMMAND(ID_QITA_ZHUANSU, OnZhuansu)
ON_COMMAND(ID_QITA_PAILIANG, OnPailiang)
ON_COMMAND(ID_QITA_BISHUIGONGLV, OnShuigonglv)
ON_COMMAND(ID_QITA_YACHA, OnYacha)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProcessView construction/destruction
CProcessView::CProcessView()
{
// TODO: add construction code here
DataNum=0;
INPUTDATA=false;
AFTERDWT=false;
DRAWWAVELET=true;
AFTERKALMAN=false;
rect.left = 50;
rect.top = 100;
rect.right = 900;
rect.bottom = 20000;
rectHeader.left = 50;
rectHeader.top = 10;
rectHeader.right = 900;
rectHeader.bottom = 80;
}
CProcessView::~CProcessView()
{
}
BOOL CProcessView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CProcessView drawing
void CProcessView::OnDraw(CDC* pDC)
{
CProcessDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
COLORREF oldBkColor = pDC->SetBkColor(RGB(250,250,255));
int i,j;
CString str;
COLORREF m_gridColor = RGB(60, 60, 60);
CPen penDot;
penDot.CreatePen(PS_DOT, 0, m_gridColor);
CPen* pOldPen = pDC->SelectObject(&penDot);
for (int x = rect.left ; x < rect.right; x += SCALE_WIDTH1)
{
if (x != 0)
{
pDC->MoveTo(x, rect.top);
pDC->LineTo(x, rect.bottom);
}
}
for (int y = rect.top ; y < rect.bottom; y += SCALE_DEPTH1)
{
if (y != 0)
{
pDC->MoveTo(rect.left, y);
pDC->LineTo(rect.right, y);
}
}
CPen penDash;
penDash.CreatePen(PS_SOLID, 1, m_gridColor);
pDC->SelectObject(&penDash);
for (y = rect.top ; y < rect.bottom; y += (10*SCALE_DEPTH1))
{
if (y != 0)
{
pDC->MoveTo(rect.left, y);
pDC->LineTo(rect.right, y);
}
}
for (x = rect.left ; x < rect.right; x +=(5*SCALE_WIDTH1))
{
if (x != 0)
{
pDC->MoveTo(x, rect.top);
pDC->LineTo(x, rect.bottom);
}
}
// Outlines
//画出边框
CPen penSolid;
penSolid.CreatePen(PS_SOLID, 2, m_gridColor);
pDC->SelectObject(&penSolid);
pDC->MoveTo(rect.left, rect.top);
pDC->LineTo(rect.right, rect.top);
pDC->MoveTo(rect.right, rect.bottom);
pDC->MoveTo(rect.left, rect.bottom);
pDC->LineTo(rect.left, rect.top);
pDC->MoveTo(rect.right, rect.top);
pDC->LineTo(rect.right, rect.bottom);
pDC->LineTo(rect.left, rect.bottom);
//绘制文件头
pDC->MoveTo(rectHeader.left, rectHeader.top);
pDC->LineTo(rectHeader.right, rectHeader.top);
pDC->MoveTo(rectHeader.right, rectHeader.bottom);
pDC->MoveTo(rectHeader.left, rectHeader.bottom);
pDC->LineTo(rectHeader.left, rectHeader.top);
pDC->MoveTo(rectHeader.right, rectHeader.top);
pDC->LineTo(rectHeader.right, rectHeader.bottom);
pDC->MoveTo(rectHeader.right, rectHeader.bottom);
pDC->LineTo(rectHeader.left, rectHeader.bottom);
pDC->SelectObject(pOldPen);
pDC->SetBkColor(oldBkColor);
if(pDoc->m_bOpenFile) DrawGrid(pDC);
CProcessApp *app=(CProcessApp *)AfxGetApp();
if(app->DRAWBPNN) DrawDataBPNet(pDC);
if(pDoc->m_bOpenFile&&AFTERDWT) DrawDataWavelet(pDC);
if(pDoc->m_bOpenFile&&AFTERKALMAN) DrawDataKalman(pDC);
}
void CProcessView::DrawGrid(CDC* pDC)
{
CString ShowFileName,strName,strNum,str1,str2;
CProcessDoc* pDoc = GetDocument();
memcpy(DataData,pDoc->DataData,sizeof(double)*shuzu);
memcpy(DataDepth,pDoc->DataDepth,sizeof(double)*shuzu);
DataNum=pDoc->DataNum;
//绘制文件头的内容
ShowFileName=pDoc->lpszinputdatafile;
strName="文件名:"+ShowFileName;
pDC->TextOut(rectHeader.left+6,rectHeader.top+5,strName);
str1.Format("%.3f米 ",pDoc->DataDepth[0]);
str2.Format("%.3f米 ",pDoc->DataDepth[DataNum-1]);
strNum=" 测井井段:";
strNum=strNum+str1+"--"+str2;
pDC->TextOut(rectHeader.left+6,rectHeader.top+25,strNum);
str1.Format("%d ",pDoc->DataNum);
strNum="数据个数:";
strNum=strNum+str1;
pDC->TextOut(rectHeader.left+6,rectHeader.top+45,strNum);
COLORREF oldBkColor = pDC->SetBkColor(RGB(250,250,255));
int i,j;
int templittle,tempbig;
CString str;
double DataDataTmp1,DataDataTmp2;
double DataDepthTmp1,DataDepthTmp2;
COLORREF m_gridColor = RGB(60, 60, 60);
CPen penDash;
penDash.CreatePen(PS_SOLID, 1, m_gridColor);
CPen* pOldPen =pDC->SelectObject(&penDash);
j=0;
templittle=int(pDoc->DataDepth[0])-int(pDoc->DataDepth[0])%10;
tempbig=int(pDoc->DataDepth[DataNum-1])-int(pDoc->DataDepth[DataNum-1])%10;
//tempbig=3000;
for (i = templittle; i <=tempbig; i+=10)
{
pDC->MoveTo(rect.left, rect.top+j);
pDC->LineTo(rect.left-10, rect.top+j);
pDC->MoveTo(rect.left, rect.top+j+1);
pDC->LineTo(rect.left-10, rect.top+j+1);
str.Format("%d",i);
pDC->TextOut(rect.left-36, rect.top+j, str);
j+= 10*SCALE_DEPTH1;
}
lMaxData=0;
lMinData=0;
for (i=0; i<DataNum; i++)
{
// 判断是否大于当前最大值
if (DataData[i] > lMaxData)
{
// 更新最大值
lMaxData = DataData[i];
}
if (DataData[i] < lMinData)
{
// 更新最小值
lMinData = 0.0;
}
}
COLORREF m_DataColor = RGB(0, 0, 255);
CPen penSolidData;
penSolidData.CreatePen(PS_SOLID, 1, m_DataColor);
pDC->SelectObject(&penSolidData);
int temp;
temp=0;
for (i = 1; i <DataNum; i ++)
{
DataDataTmp1=CURVE_WIDTHMAX*pDoc->DataData[i-1]/(lMaxData-lMinData);
DataDataTmp2=CURVE_WIDTHMAX*pDoc->DataData[i]/(lMaxData-lMinData);
DataDepthTmp1=SCALE_DEPTH1*(pDoc->DataDepth[i-1]-templittle);
DataDepthTmp2=SCALE_DEPTH1*(pDoc->DataDepth[i]-templittle);
pDC->MoveTo(rect.left+DataDataTmp1, rect.top+DataDepthTmp1);
pDC->LineTo(rect.left+DataDataTmp2, rect.top+DataDepthTmp2);
}
pDC->SelectObject(pOldPen);
}
void CProcessView::DrawData(CDC *pDC)
{
int i,j;
double templittle,tempbig;
CString str;
int xb, yb, xe, ye;
CString m_str;
float value;
int GL = 70;
int GR = m_totalLog.cx-10;
int GT = 25;
int GB = m_totalLog.cy-10;
int PX = GR - GL;
int PY = GB - GT;
ye=GT;
int XTicks=20;
j = XTicks / 2;
for(i = 0; i <= 10; i ++)
{
m_str.Format("%4.0f", i*100);
if(i!=0)
// PrintString(pDC,xb, GT- 15, 0, m_str);
if (i > 0 && i < XTicks)
{
pDC->MoveTo(xb, yb);
pDC->LineTo(xe, ye);
}
}
}
/////////////////////////
void CProcessView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
// OnUpdate(NULL, 0, NULL);
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx =1000;
sizeTotal.cy = 20200;
SetScrollSizes(MM_TEXT, sizeTotal);
}
/////////////////////////////////////////////////////////////////////////////
// CProcessView printing
void CProcessView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CProcessView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CProcessView diagnostics
#ifdef _DEBUG
void CProcessView::AssertValid() const
{
CScrollView::AssertValid();
}
void CProcessView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CProcessDoc* CProcessView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CProcessDoc)));
return (CProcessDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CProcessView message handlers
void CProcessView::OnWavelet()
{
/*
if(INPUTDATA==false)
{
AfxMessageBox("请先输入数据!");
return;
}
*/
int t=GetNumber("请选择分解的层数!!!",1,12);
J=t;//分解的层数
int i,j,wlen,sca[20],flag[20];
int m;//分解的层数
int count;
//
static double h[]={0.332670552950,0.806891509311,0.459877502118,
-0.135011020010,-0.085441273882,0.035226291882};
static double g[]={0.0352263,0.08544127,-0.135011,
-0.459877502118,0.8068915,-0.33267055};
wlen=6;//小波长度
char d_name[16]="temp\\d0.txt",c_name[16]="temp\\c0.txt";
m=J;
j=DataNum;
flag[0]=0;
for(i=0;i<=m;i++)
{
flag[i+1]=flag[i]+j;
sca[i]=j;
j=j/2;
}
count=2*DataNum;
memcpy(DataWaveletLow,DataData,sizeof(double)*shuzu);
memcpy(DataWaveletHigh,DataData,sizeof(double)*shuzu);
DWT(g,h,wlen,DataWaveletLow,DataWaveletHigh,m,sca);
ofstream ostrm,ostrmc,ostrmd;
ostrm.open( c_name);
for(i=0;i<DataNum;i++)
{
ostrm<<DataWaveletLow[i]<<endl;
}
ostrm.close();
for(i=1;i<=J;i++)
{
c_name[6]++;
d_name[6]++;
ostrmc.open( c_name);
ostrmd.open( d_name);
for(j=0;j<sca[i];j++)
{
ostrmc<<DataWaveletLow[flag[i]+j]<<endl;
ostrmd<<DataWaveletHigh[flag[i]+j]<<endl;
}
ostrmc.close();
ostrmd.close();
}
AFTERDWT=true;
DRAWWAVELET=true;
CProcessDoc* pDoc = GetDocument();
memcpy(pDoc->DataWaveletLow,DataWaveletLow,sizeof(double)*shuzu);
memcpy(pDoc->DataWaveletHigh,DataWaveletHigh,sizeof(double)*shuzu);
Invalidate();
}
void CProcessView::DrawDataWavelet(CDC *pDC)
{
CProcessDoc* pDoc = GetDocument();
memcpy(DataWaveletLow,pDoc->DataWaveletLow,sizeof(double)*shuzu);
memcpy(DataWaveletHigh,pDoc->DataWaveletHigh,sizeof(double)*shuzu);
COLORREF oldBkColor = pDC->SetBkColor(RGB(250,250,255));
int i,j;
double templittle,tempbig;
CString str;
double DataDataTmp1,DataDataTmp2;
double DataDepthTmp1,DataDepthTmp2;
double DataDataTmpHigh1,DataDataTmpHigh2;
int tmp,tmpDataLength;
COLORREF m_gridColor = RGB(60, 60, 60);
pDC->SetBkColor(oldBkColor);
lMaxDataLow=0;
lMinDataLow=0;
lMaxDataHigh=0;
lMinDataHigh=0;
for (i=0; i<(2*DataNum-DataNum/(1<<J)); i++)
{
// 判断是否大于当前最大值
if (pDoc->DataWaveletLow[i] > lMaxDataLow)
{
// 更新最大值
lMaxDataLow= pDoc->DataWaveletLow[i];
}
if (pDoc->DataWaveletLow[i] < lMinDataLow)
{
lMinDataLow = pDoc->DataWaveletLow[i];
}
if (pDoc->DataWaveletHigh[i] > lMaxDataHigh)
{
lMaxDataHigh = pDoc->DataWaveletHigh[i];
}
if (pDoc->DataWaveletHigh[i] < lMinDataHigh)
{
lMinDataHigh = pDoc->DataWaveletHigh[i];
}
}
COLORREF m_DataColor = RGB(255, 0, 0);
CPen penSolidData;
penSolidData.CreatePen(PS_SOLID, 1, m_DataColor);
CPen* pOldPen = pDC->SelectObject(&penSolidData);
templittle=int(pDoc->DataDepth[0])-int(pDoc->DataDepth[0])%10;
tempbig=int(pDoc->DataDepth[DataNum/2-1])-int(pDoc->DataDepth[DataNum/2-1])%10;
if(DRAWWAVELET==true)
{
tmpDataLength=0;
for(i=1;i<=J;i++)
{
tmp=1<<i;
tmpDataLength+=DataNum*2/tmp;
}
for (i = 1; i <DataNum/tmp; i ++)
{
DataDataTmp1=CURVE_WIDTHMAX*pDoc->DataWaveletLow[i+tmpDataLength-1]/(lMaxDataLow-lMinDataLow);
DataDataTmp2=CURVE_WIDTHMAX*pDoc->DataWaveletLow[i+tmpDataLength]/(lMaxDataLow-lMinDataLow);
DataDataTmpHigh1=CURVE_WIDTHMAX*pDoc->DataWaveletHigh[i+tmpDataLength-1]/(lMaxDataHigh-lMinDataHigh);
DataDataTmpHigh2=CURVE_WIDTHMAX*pDoc->DataWaveletHigh[i+tmpDataLength]/(lMaxDataHigh-lMinDataHigh);
DataDepthTmp1=SCALE_DEPTH1*(pDoc->DataDepth[i]-templittle);
DataDepthTmp2=SCALE_DEPTH1*(pDoc->DataDepth[i+1]-templittle);
pDC->MoveTo(rect.left+DataDataTmp1+2*SCALE_WIDTH2, rect.top+DataDepthTmp1);
pDC->LineTo(rect.left+DataDataTmp2+2*SCALE_WIDTH2, rect.top+DataDepthTmp2);
pDC->MoveTo(rect.left+DataDataTmpHigh1+2*SCALE_WIDTH2+200, rect.top+DataDepthTmp1);
pDC->LineTo(rect.left+DataDataTmpHigh2+2*SCALE_WIDTH2+200, rect.top+DataDepthTmp2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -