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

📄 set5view.cpp

📁 一套故障诊断监测系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Set5View.cpp : implementation of the CSet5View class
//

#include "stdafx.h"
#include "CDMS.h"

#include "Set5Doc.h"
#include "Set5View.h"

#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSet5View

IMPLEMENT_DYNCREATE(CSet5View, CFormView)

BEGIN_MESSAGE_MAP(CSet5View, CFormView)
	//{{AFX_MSG_MAP(CSet5View)
	ON_WM_PAINT()
	ON_WM_DESTROY()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSet5View construction/destruction

CSet5View::CSet5View()
	: CFormView(CSet5View::IDD)
{
	//{{AFX_DATA_INIT(CSet5View)
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	m_pMainFrame = NULL;
	m_bStart = FALSE;

	m_nCount = 0;	//视图循环计数器
	m_nCurMP = 0;	//测点循环计数器
	m_nChaDataTimer = -1;	//特征数组计数器

	m_nSampleFrenquence = 1024;		//采样频率
	m_dRPM = 4000.0;			//机组转速,转/分

	for(int i=0; i<12; i++)
	{
		for(int j=0; j<1024; j++)
			m_nData[i][j] = 0.0;
		m_dCharacterValue[i] = 0.0;
	}

}

CSet5View::~CSet5View()
{
}

void CSet5View::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSet5View)
	DDX_Control(pDX, IDC_STATIC9, m_cMP9);
	DDX_Control(pDX, IDC_STATIC12, m_cMP12);
	DDX_Control(pDX, IDC_STATIC8, m_cMP8);
	DDX_Control(pDX, IDC_STATIC7, m_cMP7);
	DDX_Control(pDX, IDC_STATIC6, m_cMP6);
	DDX_Control(pDX, IDC_STATIC11, m_cMP11);
	DDX_Control(pDX, IDC_STATIC10, m_cMP10);
	DDX_Control(pDX, IDC_STATIC5, m_cMP5);
	DDX_Control(pDX, IDC_STATIC4, m_cMP4);
	DDX_Control(pDX, IDC_STATIC3, m_cMP3);
	DDX_Control(pDX, IDC_STATIC2, m_cMP2);
	DDX_Control(pDX, IDC_STATIC1, m_cMP1);
	//}}AFX_DATA_MAP
}

BOOL CSet5View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

void CSet5View::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
//	ResizeParentToFit();

	InitCobArray();

//    ReadZutaiFile(); 

	/*----隐藏滚动条----*/
	CSize sizeTotal;
	sizeTotal.cx = sizeTotal.cy = 0;
	SetScrollSizes(MM_TEXT, sizeTotal);
	/*----隐藏滚动条----*/

	//<-------------获取主框架指针------------->
	m_pMainFrame = (CMainFrame*)AfxGetMainWnd();

	//<-------------保存窗口指针------------->
	m_pMainFrame->m_hViewSet5 = this->m_hWnd;

}

void CSet5View::InitCobArray()
{
	m_staticArray.SetSize(12);
	m_staticArray.SetAt(0,&m_cMP1);
	m_staticArray.SetAt(1,&m_cMP2);
	m_staticArray.SetAt(2,&m_cMP3);
	m_staticArray.SetAt(3,&m_cMP4);
	m_staticArray.SetAt(4,&m_cMP5);
	m_staticArray.SetAt(5,&m_cMP6);
	m_staticArray.SetAt(6,&m_cMP7);
	m_staticArray.SetAt(7,&m_cMP8);
	m_staticArray.SetAt(8,&m_cMP9);
	m_staticArray.SetAt(9,&m_cMP10);
	m_staticArray.SetAt(10,&m_cMP11);
	m_staticArray.SetAt(11,&m_cMP12);

	for(int i=0;i<12;i++)
	{
		((CLabel*)m_staticArray.GetAt(i))->ShowWindow(FALSE);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CSet5View printing

BOOL CSet5View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CSet5View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CSet5View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void CSet5View::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/////////////////////////////////////////////////////////////////////////////
// CSet5View diagnostics

#ifdef _DEBUG
void CSet5View::AssertValid() const
{
	CFormView::AssertValid();
}

void CSet5View::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CSet5Doc* CSet5View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSet5Doc)));
	return (CSet5Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSet5View message handlers



void CSet5View::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here

	DrawTimeDomainWave();	//画时域波形
//	DrawHistoGram();		//画柱状图
	DrawNarrowbandAlarm();	//画窄带报警
	DrawTrendCurve();		//画趋势曲线
	DrawLeftAxesTrack();	//画左轴心轨迹
	DrawRightAxesTrack();	//画右轴心轨迹

	// Do not call CFormView::OnPaint() for painting messages
}

void CSet5View::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent == 5)
	{
		//设置静态控件数字
		SetStaticValue();
		//画时域波形
		DrawTimeDomainWave();
		//画柱状图
//		DrawHistoGram();
		//画窄带报警
		DrawNarrowbandAlarm();
		//画趋势曲线
		DrawTrendCurve();
		//画左轴心轨迹
		DrawLeftAxesTrack();
		//画右轴心轨迹
		DrawRightAxesTrack();
		
		//测点循环
		if(m_pMainFrame->m_bCycMp == TRUE)
			m_nCurMP++;
		if(m_nCurMP == 12)
			m_nCurMP = 0;

		//视图循环
		if(m_pMainFrame->m_bIsSet5Active == TRUE)
		{
			if(m_pMainFrame->m_bCycSet == TRUE)
			{
				m_nCount++;
				if(m_nCount == 12)
				{
					//显示完毕,发消息告诉主框架
					::SendMessage(m_pMainFrame->m_hWnd, UM_SET5COMPLETE, NULL, NULL);
					//重新开始视图循环计数
					m_nCount = 0;
				}
			}
		}
	}	
	CFormView::OnTimer(nIDEvent);
}

void CSet5View::SetStaticValue()
{
	CString ss;
	for(int i=0;i<12;i++)
	{
		ss.Format("%.3f",m_dCharacterValue[i]);
		SetBackColor(i);		
		((CLabel*)m_staticArray.GetAt(i))->SetText(ss);			
	}
	CString ss2;
    ((CLabel*)m_staticArray.GetAt(m_nCurMP))->GetWindowText(ss2);
	((CLabel*)m_staticArray.GetAt(m_nCurMP))->SetBkColor(RGB(0,255,0));
	((CLabel*)m_staticArray.GetAt(m_nCurMP))->SetText(ss2);
}

//画时域波形
void CSet5View::DrawTimeDomainWave()
{
	CWnd* pWnd = (CWnd*)GetDlgItem(IDC_SET5TIME);
	CDC *pDC = pWnd->GetDC();
	CRect rect;
    pWnd->GetClientRect(rect);
	
	CDC dcMemory;
	dcMemory.CreateCompatibleDC(pDC);

	int i;

	CBitmap *oldBitmap;
	oldBitmap=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BlackBitmap));
    CPen *oldPen;
	oldPen=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GrayPen));
	dcMemory.FillRect(&rect,&(((CCDMSApp*) AfxGetApp())->m_BlackBrush));

	//画网格
	double x,y;
    x=rect.Width()/8.0;
	y=rect.Height()/4.0;
	for(i=1; i<11; i++)
	{
		dcMemory.MoveTo((int)(x*i),0);
		dcMemory.LineTo((int)(x*i),rect.Height());
	}
	for(i=0; i<2; i++)
	{
		dcMemory.MoveTo(0,rect.Height()/2-(int)(y*i));
		dcMemory.LineTo(rect.Width(),rect.Height()/2-(int)(y*i));
		dcMemory.MoveTo(0,rect.Height()/2+(int)(y*i));
		dcMemory.LineTo(rect.Width(),rect.Height()/2+(int)(y*i));
	}
/*
	//画坐标
	dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BluePen));
    x=rect.Width()/8.0;
	y=rect.Height()/8.0;
	for(i=1; i<8; i++)
	{
		dcMemory.MoveTo(0,(int)(y*i));
		dcMemory.LineTo(5,(int)(y*i));
	}
	for(i=1; i<8; i++)
	{
		dcMemory.MoveTo((int)(x*i),rect.Height());
		dcMemory.LineTo((int)(x*i),rect.Height()-5);
	}
*/
	// 高度比例=rect.Height()/(2^A/D位数),即=rect.Height()×增益×灵敏度/(A/D量程)
	//实际值0对应于rect.Height()/2
	//每rect.Height()/4对应于(2^A/D位数)/4,即A/D量程/(4×增益×灵敏度)
	if(m_bStart == TRUE)
	{
		//画波形
		dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GreenPen));
		dcMemory.MoveTo(0,(int)m_nData[m_nCurMP][0]);
		for(i=0; i<512; i++)
		{
			dcMemory.LineTo(4*i,(int)m_nData[m_nCurMP][i]);
		}
	}

	pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMemory,0,0,SRCCOPY);

    dcMemory.SelectObject(oldPen);
	dcMemory.SelectObject(oldBitmap);
	pWnd->ReleaseDC(pDC);
	::DeleteObject(&oldPen);
	::DeleteObject(&oldBitmap);
}
/*
//画柱状图
void CSet5View::DrawHistoGram()
{
	CWnd* pWnd = (CWnd*)GetDlgItem(IDC_SET5HISTOGRAM);
	CDC *pDC = pWnd->GetDC();
	CRect rect;
    pWnd->GetClientRect(rect);

	CDC dcMemory;
	dcMemory.CreateCompatibleDC(pDC);

	CBitmap *oldBitmap;
	oldBitmap=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BlackBitmap));
	dcMemory.FillRect(&rect,&(((CCDMSApp*) AfxGetApp())->m_BlackBrush));
 
	CPen *oldPen;
	oldPen=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GrayPen));
	dcMemory.MoveTo(rect.Width()/2,0);
	dcMemory.LineTo(rect.Width()/2,rect.Height());
	dcMemory.MoveTo(0,rect.top + rect.Height()/5);
	dcMemory.LineTo(rect.Width(),rect.top + rect.Height()/5);
	dcMemory.MoveTo(0,rect.top + 3*rect.Height()/5);
	dcMemory.LineTo(rect.Width(),rect.top + 3*rect.Height()/5);

	if(m_bStart == TRUE)
	{
		double dAlarm = 62;		//警告值
		double dAlert = 64;		//报警值
		double scaleHeight = 2*rect.Height()/5.0/(dAlert-dAlarm);
		CRect rcRed, rcYellow, rcGreen, rcBlue;

		rcRed.left = rcYellow.left = rcGreen.left = rect.left;
		rcRed.right = rcYellow.right = rcGreen.right = rcBlue.left = rect.left + rect.Width()/2;
		rcRed.top = rect.top;
		rcRed.bottom = rcYellow.top = rect.top + rect.Height()/5;
		rcYellow.bottom = rcGreen.top = rect.top + 3*rect.Height()/5;
		rcGreen.bottom = rcBlue.bottom = rect.bottom;
		rcBlue.right = rect.right;
		rcBlue.top = rcGreen.top - (int)((m_dCharacterValue[m_nCurMP]-dAlarm) * scaleHeight);
	
		//标纵坐标值
		CString zuobiao;
		zuobiao.Format("%.1f-",dAlert);
		GetDlgItem(IDC_HGY_ALERT)->SetWindowText(zuobiao);
		zuobiao.Format("%.1f-",dAlarm);
		GetDlgItem(IDC_HGY_ALARM)->SetWindowText(zuobiao);

		//画左侧参考值
		dcMemory.FillRect(&rcRed,&(((CCDMSApp*) AfxGetApp())->m_RedBrush));
		dcMemory.FillRect(&rcYellow,&(((CCDMSApp*) AfxGetApp())->m_YellowBrush));
		dcMemory.FillRect(&rcGreen,&(((CCDMSApp*) AfxGetApp())->m_GreenBrush));
		//画右侧实际值
		dcMemory.FillRect(&rcBlue,&(((CCDMSApp*) AfxGetApp())->m_BlueBrush));
	}

	pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMemory,0,0,SRCCOPY);

    dcMemory.SelectObject(oldPen);
	dcMemory.SelectObject(oldBitmap);
	pWnd->ReleaseDC(pDC);
	::DeleteObject(&oldPen);
	::DeleteObject(&oldBitmap);
}
*/
//画窄带报警
void CSet5View::DrawNarrowbandAlarm()
{
	CWnd* pWnd = (CWnd*)GetDlgItem(IDC_SET5AMPLI);
	CDC *pDC = pWnd->GetDC();
	CRect rect;
    pWnd->GetClientRect(rect);

	int i;

	CDC dcMemory;
	dcMemory.CreateCompatibleDC(pDC);

	CBitmap *oldBitmap;
	oldBitmap=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BlackBitmap));
    CPen *oldPen;
	oldPen=dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_GrayPen));
	dcMemory.FillRect(&rect,&(((CCDMSApp*) AfxGetApp())->m_BlackBrush));

	double x,y;
    x=rect.Width()/8.0;
	y=rect.Height()/4.0;
	for(i=1; i<11; i++)
	{
		dcMemory.MoveTo((int)(x*i),0);
		dcMemory.LineTo((int)(x*i),rect.Height());
	}
	for(i=0; i<2; i++)
	{
		dcMemory.MoveTo(0,rect.Height()/2-(int)(y*i));
		dcMemory.LineTo(rect.Width(),rect.Height()/2-(int)(y*i));
		dcMemory.MoveTo(0,rect.Height()/2+(int)(y*i));
		dcMemory.LineTo(rect.Width(),rect.Height()/2+(int)(y*i));
	}

	//---------画小矩形框---------//
	int nAlarmRect;		//小矩形框高度
	int nXCoordinate;	//小矩形中心的x坐标值
	double nSixth;		//窄带报警窗口宽度的1/6
	nSixth = rect.Width()/6.0;

	dcMemory.SelectObject(&(((CCDMSApp*) AfxGetApp())->m_BluePen));
	for(i=0;i<5;i++)
	{
		switch (i)
		{
		case 0:		//半倍频
			nXCoordinate = (int)(0.5*nSixth);
			nAlarmRect = (int)(rect.Height()*0.7);
			break;
		case 1:		//一倍频
			nXCoordinate = (int)nSixth;
			nAlarmRect = (int)(rect.Height()*0.1);
			break;
		case 2:		//二倍频
			nXCoordinate = (int)(2*nSixth);
			nAlarmRect = (int)(rect.Height()*0.5);
			break;
		case 3:		//三倍频
			nXCoordinate = (int)(3*nSixth);
			nAlarmRect = (int)(rect.Height()*0.7);
			break;
		case 4:		//二十倍频
			nXCoordinate = (int)(5*nSixth);
			nAlarmRect = (int)(rect.Height()*0.9);
			break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -