📄 fueleconomyview.cpp
字号:
// FuelEconomyView.cpp : implementation of the CFuelEconomyView class
//
#include "stdafx.h"
#include "FuelEconomy.h"
#include "FuelEconomyDoc.h"
#include "FuelEconomyView.h"
#include "CanShuLuRu.h"
#include "math.h"
#include "DataLuruDlg.h"
#include "DataDuruDlg.h"
#include "DataShuChuDlg.h"
#include "GongKAnsysDlg.h"
#include "GongKuangAnsys1Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFuelEconomyView
IMPLEMENT_DYNCREATE(CFuelEconomyView, CView)
BEGIN_MESSAGE_MAP(CFuelEconomyView, CView)
//{{AFX_MSG_MAP(CFuelEconomyView)
ON_COMMAND(ID_KAISHI, OnKaishi)
ON_UPDATE_COMMAND_UI(ID_JISUANCHULI, OnUpdateJisuanchuli)
ON_COMMAND(ID_MEN_I0, OnMenI0)
ON_COMMAND(ID_MENU_CD, OnMenuCd)
ON_COMMAND(ID_MENU_F, OnMenuF)
ON_COMMAND(ID_MENU_M, OnMenuM)
ON_COMMAND(ID_MENU_NT, OnMenuNt)
ON_UPDATE_COMMAND_UI(ID_MEN_I0, OnUpdateMenI0)
ON_UPDATE_COMMAND_UI(ID_MENU_CD, OnUpdateMenuCd)
ON_UPDATE_COMMAND_UI(ID_MENU_F, OnUpdateMenuF)
ON_UPDATE_COMMAND_UI(ID_MENU_M, OnUpdateMenuM)
ON_UPDATE_COMMAND_UI(ID_MENU_NT, OnUpdateMenuNt)
ON_COMMAND(ID_MENU_A, OnMenuA)
ON_UPDATE_COMMAND_UI(ID_MENU_A, OnUpdateMenuA)
ON_COMMAND(ID_DURU, OnDuru)
ON_COMMAND(ID_SHOUDONGLURU, OnShoudongluru)
ON_COMMAND(ID_JISUANDENG, OnJisuandeng)
ON_UPDATE_COMMAND_UI(ID_JISUANDENG, OnUpdateJisuandeng)
ON_COMMAND(ID_JISUANLIU, OnJisuanliu)
ON_UPDATE_COMMAND_UI(ID_JISUANLIU, OnUpdateJisuanliu)
ON_COMMAND(ID_JISUANSI, OnJisuansi)
ON_UPDATE_COMMAND_UI(ID_JISUANSI, OnUpdateJisuansi)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFuelEconomyView construction/destruction
double g,f;
int xm0=0,xm=0,TeDone=0,JiS=0;//TeDone万有特性拟合是否完成标识符,JiS计算标识符
const double PI=3.14159;
COLORREF colb;
double HI,poix[10000],poiy[10000],poix0[10000],poiy0[10000],poix1[1000],poiy1[1000];
const int MM=15;
int K;//录入万有特性试验数据的个数
double P[100],G[100],Z[100],X[100][MM+1],Y[100],AA[MM+1][MM+2],XTX[MM+1][MM+1],XTY[MM+1];
float NN[100];
double x[16],Ge;
int menuItem=0;//分析项目选择标识
int GKAnsys;//分析工况选择标识0等速1四工况2六工况
double vbox;// 存储等速时的计算速度
float Kr=1.02,Pem=3;//功率修正系数;动力转向泵损失2.0--3.5kw+发电机损失1.5--3.0kw+被动式空调一般损耗发动机的10%+其它损失
extern double m,A,Cd,i0,ig[10],If,Iw,R,be0,M,Delta[10],nT,rou,PpP[100],GgG[100];//M为修正后的整车质量 Delta存放旋转质量换算系数
extern int Uamax,Memax,DangWShu,CheXing,N,GongKuang,Nmax,Nmin,DuQv;//DangWShu 挡位数,ChengXing车型代码,N为乘员数
extern CString JiXing;
extern float NnN[100];
double ua_min[10]; //最低车速(估算)
double ua_max[10]; //最高车速(估算)
int J=0;//标识符,记录等速工况下的采样点个数;
int ZHIJIE;//标识直接挡
extern double Deng[],Liu,Si;
CFuelEconomyView::CFuelEconomyView()
{
// TODO: add construction code here
g=9.8;
f=0.018;
int i;
for(i=0;i<10000;i++){
poix[i]=0;poiy[i]=0;
poix0[i]=0;poiy0[i]=0;
poix0[i]=0;poiy1[i]=0;
}
colb=RGB(220,220,220);HI=38;
}
CFuelEconomyView::~CFuelEconomyView()
{
}
BOOL CFuelEconomyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFuelEconomyView drawing
void CFuelEconomyView::OnDraw(CDC* pDC)
{
extern int GongKuang;
CFuelEconomyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CBitmap Bitmap,*pOldBitmap;
CDC MemDC;
Bitmap.LoadBitmap(IDB_BITMAP1);
MemDC.CreateCompatibleDC(pDC);
pOldBitmap=MemDC.SelectObject(&Bitmap);
pDC->BitBlt(0,0,1150,800,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
if(xm==0){}
else{
CRect rect;
CFont fnBig;
CFont*poldFont;
fnBig.CreatePointFont(int(HI*8.0),"Arial",pDC);
poldFont=pDC->SelectObject(&fnBig);
FillRect(pDC,colb,(0,0),1500,1500);
GetClientRect(&rect);
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetViewportOrg(int(rect.right/10),int(rect.bottom/1.2));
pDC->SelectObject(poldFont);
if(GongKuang==0){HuaDengTu(pDC);}
if(GongKuang==1){HuaSiTu(pDC);}
if(GongKuang==2){HuaLiuTu(pDC);}
for(int i=0;i<10000;i++){
poix[i]=0;poiy[i]=0;
poix0[i]=0;poiy0[i]=0;
}
xm=0;
}
if(menuItem==0){}
else{
CRect rect;
CFont fnBig;
CFont*poldFont;
fnBig.CreatePointFont(int(HI*8.0),"Arial",pDC);
poldFont=pDC->SelectObject(&fnBig);
FillRect(pDC,colb,(0,0),1500,1500);
GetClientRect(&rect);
pDC->SetMapMode(MM_LOMETRIC);
pDC->SetViewportOrg(int(rect.right/10),int(rect.bottom/1.2));
pDC->SelectObject(poldFont);
if(menuItem==1){HuaMTu(pDC);}
if(menuItem==2){HuaCdTu(pDC);}
if(menuItem==3){HuafTu(pDC);}
if(menuItem==4){HuanTTu(pDC);}
if(menuItem==5){HuaI0Tu(pDC);}
if(menuItem==6){HuaATu(pDC);}
menuItem=0;
for(int i=0;i<10000;i++){
poix1[i]=0;poiy1[i]=0;
}
}
}
/////////////////////////////////////////////////////////////////////////////
// CFuelEconomyView printing
BOOL CFuelEconomyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFuelEconomyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFuelEconomyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFuelEconomyView diagnostics
#ifdef _DEBUG
void CFuelEconomyView::AssertValid() const
{
CView::AssertValid();
}
void CFuelEconomyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CFuelEconomyDoc* CFuelEconomyView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFuelEconomyDoc)));
return (CFuelEconomyDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFuelEconomyView message handlers
void CFuelEconomyView::OnKaishi()
{
// TODO: Add your command handler code here
CCanShuLuRu dlg;
dlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
//基本公式
float CFuelEconomyView::BaseN(double v, int DangW)//转速
{
extern double R,ig[10];
extern int Nmin,Nmax;
float Nn;
Nn=(float)((v*i0*ig[DangW])/(0.377*R));
if(Nn<Nmin||Nn>Nmax){return (float)Nmin;}
else{
return Nn;}
}
double CFuelEconomyView::BasePe(double v, int DangW,double a)//阻力功率
{ extern double f,Cd,A,nT,Delta[10];
double Pe;
Pe=((M*g*f*v)/3600+(Cd*A*v*v*v)/76140+((M*v*a*Delta[DangW])/3600))/nT;
return Pe*Kr+Pem;
}
double CFuelEconomyView::Qt(double Pe, double ge)//单位时间燃油消耗量 mL/s
{
double Qt;
extern double rou;
Qt=(Pe*ge)/(367.1*rou);
return Qt;
}
/////////////////////////////////////////////////////////////////////////////
//基本工况
double CFuelEconomyView::DengGK(double v, int DangW,double s)//等速过程
{
extern double rou;
double Qa,P,b;
float n;
n=BaseN(v,DangW);
P=BasePe(v,DangW,0);
b=gee(P,n);
Qa=(P*b*s)/(102*rou*v);//单位ml
return Qa;
}
double CFuelEconomyView::JiaGK(double v0, double vt, int DangW,double aj)//等加速过程
{
extern double m,A,Cd,ig[10],If,Iw,R,be0,M,a,Delta[10],nT,rou;
double Q[10000],Qbox,DelT,Qb=0,v;
int j,k;
DelT=0.05/(3.6*aj);
Qbox=0;// 单位s
v=v0;
for(k=0;k<10000;k++){
Q[k]=0;
}
for(j=0;v<vt;j++){
Qbox=Qt(BasePe(v,DangW,aj),gee(BasePe(v,DangW,aj),BaseN(v,DangW)));
Qbox+=Qt(BasePe((v+1),DangW,aj),gee(BasePe((v+1),DangW,aj),BaseN((v+1),DangW)));
Q[j]=(Qbox*DelT)/2;
v+=0.05;
}
for(k=0;k<j;k++){
Qb+=Q[k];
}
return Qb;
}
double CFuelEconomyView::DaiGK(double t)//减速或怠速过程
{
extern double be0;
double Qc;
Qc=be0*t;
return Qc;
}
/////////////////////////////////////////////////////////////////////////////
//循环工况
double CFuelEconomyView::LiuGongKuang(int DangW)//六工况
{
extern double ig[10];
double Qbox=0,QLiu;
if(ig[DangW]==1){
Qbox+=DengGK(40,DangW,125);
Qbox+=JiaGK(40,50,DangW,0.2);
Qbox+=DengGK(50,DangW,250);
Qbox+=JiaGK(50,60,DangW,0.17);
Qbox+=DengGK(60,DangW,250);
Qbox+=DaiGK(21.6);
QLiu=(100*Qbox)/1350;// L/100km
}
return QLiu;
}
double CFuelEconomyView::SiGongKuang(int DangWShu)//四工况
{
double Qbox=0,QSi;
if(DangWShu<5){
Qbox+=JiaGK(0,7,1,(7-0)/(3.6*5.6));
Qbox+=JiaGK(7,14,2,(14-7)/(3.6*8.8));
Qbox+=JiaGK(14,20,3,(20-14)/(3.6*11.8));
Qbox+=JiaGK(20,25,4,(25-20)/(3.6*11.4));
Qbox+=DengGK(25,4,120);
Qbox+=JiaGK(25,40,4,(40-25)/(3.6*17.7));
Qbox+=DaiGK((3.6*270)/40);
}
else{
Qbox+=JiaGK(0,7,2,(7-0)/(3.6*5.6));
Qbox+=JiaGK(7,14,3,(14-7)/(3.6*8.8));
Qbox+=JiaGK(14,20,4,(20-14)/(3.6*11.8));
Qbox+=JiaGK(20,25,5,(25-20)/(3.6*11.4));
Qbox+=DengGK(25,5,120);
Qbox+=JiaGK(25,40,5,(40-25)/(3.6*17.7));
Qbox+=DaiGK((3.6*270)/40);
}
QSi=(100*Qbox)/700;
return QSi;
}
double CFuelEconomyView::DengGongKuang(double v,int DangW)//等速工况
{
double Qbox=0,Qdeng;
Qbox=DengGK(v,DangW,500);
Qdeng=(100*Qbox)/500;// L/100km
return Qdeng;
}
/////////////////////////////////////////////////////////////////////
void CFuelEconomyView::OnJisuandeng()
{
// TODO: Add your command handler code here
xm=1;
GongKuang=0;
Deng[0]=DengGongKuang(40,ZHIJIE);
Deng[1]=DengGongKuang(50,ZHIJIE);
Deng[2]=DengGongKuang(60,ZHIJIE);
Deng[3]=DengGongKuang(70,ZHIJIE);
Deng[4]=DengGongKuang(80,ZHIJIE);
Deng[5]=DengGongKuang(90,ZHIJIE);
InvalidateRect(NULL,FALSE);
}
void CFuelEconomyView::OnUpdateJisuandeng(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable((xm0>0&&TeDone>0)?TRUE:FALSE);
}
void CFuelEconomyView::OnJisuanliu()
{
// TODO: Add your command handler code here
xm=1;
Liu=LiuGongKuang(ZHIJIE);
GongKuang=2;
InvalidateRect(NULL,FALSE);
}
void CFuelEconomyView::OnUpdateJisuanliu(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable((xm0>0&&TeDone>0&&CheXing==0)?TRUE:FALSE);
}
void CFuelEconomyView::OnJisuansi()
{
// TODO: Add your command handler code here
xm=1;
Si=SiGongKuang(DangWShu);
GongKuang=1;
InvalidateRect(NULL,FALSE);
}
void CFuelEconomyView::OnUpdateJisuansi(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable((xm0>0&&TeDone>0&&CheXing==1)?TRUE:FALSE);
}
void CFuelEconomyView::OnUpdateJisuanchuli(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable((xm0>0&&TeDone>0)?TRUE:FALSE);
if(xm0==0||TeDone==0){MessageBox("请先完成前两项菜单内容!");}
}
/////////////////////////////////////////////////////////////////////////////
//绘图
void CFuelEconomyView::Line0(CDC* pDC,double x1,double y1,double x2,double y2,int siw,COLORREF col)
{
CPen siPen;
CPen*pO1dPen;
siPen.CreatePen(PS_SOLID,siw,col);
pO1dPen=pDC->SelectObject(&siPen);
pDC->MoveTo(int(HI*x1),int(HI*y1));
pDC->LineTo(int(HI*x2),int(HI*y2));
pDC->SelectObject(pO1dPen);
siPen.DeleteObject();
}
void CFuelEconomyView::FillRect(CDC *pDC, COLORREF col, CPoint point, int chd, int kd)
{
CBrush newBrush(col);
CBrush*poldBrush;
poldBrush=pDC->SelectObject(&newBrush);
pDC->FillRect(CRect(point.x,point.y,point.x+chd,point.y+kd),&newBrush);
pDC->SelectObject(poldBrush);
newBrush.DeleteObject();
}
///////////////////////////////////////////////////////////////////////////////////////
//坐标
void CFuelEconomyView::DengXY(CDC *pDC)//等速工况坐标
{
int j,ds;
double x1,y1,dsy;
char buf[25];
CString sc;
pDC->SetBkColor(colb);
ds=0;x1=0;y1=0;
wsprintf(buf,"%d",ds);
pDC->TextOut(-40,-10,buf,strlen(buf));
Line0(pDC,-10,0,65,0,4,RGB(0,0,0));
pDC->TextOut(int(HI*68),-38,"Ua(km/h)");
for (j=0;j<13;j++) {
x1+=10;ds+=10;
Line0(pDC,x1/2,0,x1/2,35,1,RGB(0,0,0));//纵线
wsprintf(buf,"%d",ds);
pDC->TextOut(int(HI*x1/2)-20,-10,buf,strlen(buf));
}
dsy=20;
Line0(pDC,0,-20,0,35,4,RGB(0,0,0));
pDC->TextOut(-170,int(HI*37),"Qs(L/100km)");
for (j=0;j<14;j++) {
y1+=5;dsy+=2;
Line0(pDC,0,y1/2,65,y1/2,1,RGB(0,0,0));//横线
sc.Format("%3.1f",dsy);
pDC->TextOut(-140,int(HI*y1/2)+20,sc,strlen(sc));
}
}
void CFuelEconomyView::LiuXY(CDC *pDC)//六工况坐标
{
int j,ds;
double x1,y1,dsy;
char buf[25];
CString sc;
pDC->SetBkColor(colb);
ds=0;x1=80;y1=10;
wsprintf(buf,"%d",ds);
pDC->TextOut(-40,180,buf,strlen(buf));
Line0(pDC,-10,5,32.5,5,4,RGB(0,0,0));//x轴
pDC->TextOut(int(HI*34),180,"t(s)");
for (j=0;j<10;j++) {
x1+=6.5;ds+=10;
Line0(pDC,x1/2,5,x1/2,30,1,RGB(0,0,0));//纵线
wsprintf(buf,"%d",ds);
pDC->TextOut(int(HI*x1/2)-20,180,buf,strlen(buf));
}
dsy=0;
Line0(pDC,40,0,40,30,4,RGB(0,0,0));//y轴
pDC->TextOut(-170,int(HI*32),"Q(ml)");
for (j=0;j<10;j++) {
y1+=5;dsy+=60;
Line0(pDC,0,y1/2,32.5,y1/2,1,RGB(0,0,0));//横线
sc.Format("%3.1f",dsy);
pDC->TextOut(-140,int(HI*y1/2)+20,sc,strlen(sc));
}
Fontstr(pDC,400,80,"楷体_GB2312",40.0f,"燃油消耗量-时间曲线");
/////////////////////
int jo,dso;
double x1o,y1o,dsyo;
char bufo[25];
CString sco;
pDC->SetBkColor(colb);
dso=0;x1o=0;y1o=10;
wsprintf(bufo,"%d",dso);
pDC->TextOut(1480,180,bufo,strlen(bufo));
Line0(pDC,35,5,72.5,5,4,RGB(0,0,0));//x轴
pDC->TextOut(int(HI*75),180,"t(s)");
for (jo=0;jo<10;jo++) {
x1o+=6.5;dso+=10;
Line0(pDC,x1o/2,5,x1o/2,30,1,RGB(0,0,0));//纵线
wsprintf(bufo,"%d",dso);
pDC->TextOut(int(HI*x1o/2)-20,180,bufo,strlen(bufo));
}
dsyo=0;
Line0(pDC,0,0,0,30,4,RGB(0,0,0));//y轴
pDC->TextOut(1400,int(HI*32),"Qt(mL/s)");
for (jo=0;jo<10;jo++) {
y1o+=5;dsyo+=1;
Line0(pDC,40,y1o/2,72.5,y1o/2,1,RGB(0,0,0));//横线
sco.Format("%3.1f",dsyo);
pDC->TextOut(1400,int(HI*y1o/2)+20,sco,strlen(sco));
}
Fontstr(pDC,2000,80,"楷体_GB2312",40.0f,"单位燃油消耗-时间曲线");
}
void CFuelEconomyView::SiXY(CDC *pDC)//四工况坐标
{
int j,ds;
double x1,y1,dsy;
char buf[25];
CString sc;
pDC->SetBkColor(colb);
ds=0;x1=80;y1=10;
wsprintf(buf,"%d",ds);
pDC->TextOut(-40,180,buf,strlen(buf));
Line0(pDC,-10,5,32.5,5,4,RGB(0,0,0));//x轴
pDC->TextOut(int(HI*34),180,"t(s)");
for (j=0;j<10;j++) {
x1+=6.5;ds+=10;
Line0(pDC,x1/2,5,x1/2,30,1,RGB(0,0,0));//纵线
wsprintf(buf,"%d",ds);
pDC->TextOut(int(HI*x1/2)-20,180,buf,strlen(buf));
}
dsy=0;
Line0(pDC,40,0,40,30,4,RGB(0,0,0));//y轴
pDC->TextOut(-170,int(HI*32),"Q(ml)");
for (j=0;j<10;j++) {
y1+=5;dsy+=35;
Line0(pDC,0,y1/2,32.5,y1/2,1,RGB(0,0,0));//横线
sc.Format("%3.1f",dsy);
pDC->TextOut(-140,int(HI*y1/2)+20,sc,strlen(sc));
}
Fontstr(pDC,400,80,"楷体_GB2312",40.0f,"燃油消耗量-时间曲线");
int jo,dso;
double x1o,y1o,dsyo;
char bufo[25];
CString sco;
pDC->SetBkColor(colb);
dso=0;x1o=0;y1o=10;
wsprintf(bufo,"%d",dso);
pDC->TextOut(1480,180,bufo,strlen(bufo));
Line0(pDC,35,5,72.5,5,4,RGB(0,0,0));//x轴
pDC->TextOut(int(HI*75),180,"t(s)");
for (jo=0;jo<10;jo++) {
x1o+=6.5;dso+=10;
Line0(pDC,x1o/2,5,x1o/2,30,1,RGB(0,0,0));//纵线
wsprintf(bufo,"%d",dso);
pDC->TextOut(int(HI*x1o/2)-20,180,bufo,strlen(bufo));
}
dsyo=0;
Line0(pDC,0,0,0,30,4,RGB(0,0,0));//y轴
pDC->TextOut(1400,int(HI*32),"Qt(mL/s)");
for (jo=0;jo<10;jo++) {
y1o+=5;dsyo+=0.7;
Line0(pDC,40,y1o/2,72.5,y1o/2,1,RGB(0,0,0));//横线
sco.Format("%3.1f",dsyo);
pDC->TextOut(1400,int(HI*y1o/2)+20,sco,strlen(sco));
}
Fontstr(pDC,2000,80,"楷体_GB2312",40.0f,"单位燃油消耗-时间曲线");
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CFuelEconomyView::Fontstr(CDC *pDC, double x, double y, CString font, float nPoi, CString str)
{ CFont fnBig1;
CFont* poldFont1;
fnBig1.CreateFont(-int(nPoi),0,0,0,400,FALSE,FALSE,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,font);
poldFont1=pDC->SelectObject(&fnBig1);
pDC->TextOut(int(x),int(y),str);
pDC->SelectObject(poldFont1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -