#pragma warning(push,0) // #include "Family.h" #include #include #include #include #include #include "StatisticsDlg.h" #include "ui_Statistics.h" #include "CStringType.h" #include "Well.h" #pragma warning(pop) using namespace pai::ios::welllog; BEGIN_OSGGRAPHICS_NAMESPACE CStatisticsDlg::CStatisticsDlg(QWidget * parent, Qt::WindowFlags flags) : QWidget(parent,flags) { m_pUI = new Ui_Statistics(); m_pUI->setupUi(this); int w=width(); int h=height(); if(NULL != parent) { parent->setFixedSize(w,h); } m_pUI->cancelbtn->hide(); QObject::connect(m_pUI->okbtn, SIGNAL(clicked()), this, SLOT(slotSave())); QObject::connect(m_pUI->cancelbtn, SIGNAL(clicked()), this, SLOT(slotCancel())); QObject::connect(m_pUI->checkBox, SIGNAL(clicked()), this, SLOT(slotCheckLjpl())); QObject::connect(m_pUI->lineEditName, SIGNAL(textChanged( QString )),this,SLOT(slotChangeName(QString))); QObject::connect(m_pUI->lineEditUnit, SIGNAL(textChanged( QString )),this,SLOT(slotChangeUnit(QString))); QObject::connect(m_pUI->lineEditXmin, SIGNAL(textChanged( QString )),this,SLOT(slotChangeXmin(QString))); QObject::connect(m_pUI->lineEditXmin2, SIGNAL(textChanged( QString )),this,SLOT(slotChangeXmin2(QString))); QObject::connect(m_pUI->lineEditYmin, SIGNAL(textChanged( QString )),this,SLOT(slotChangeYmin(QString))); QObject::connect(m_pUI->lineEditXmax, SIGNAL(textChanged( QString )),this,SLOT(slotChangeXmax(QString))); QObject::connect(m_pUI->lineEditXmax2, SIGNAL(textChanged( QString )),this,SLOT(slotChangeXmax2(QString))); QObject::connect(m_pUI->lineEditYmax, SIGNAL(textChanged( QString )),this,SLOT(slotChangeYmax(QString))); QObject::connect(m_pUI->lineEditSdep, SIGNAL(textChanged( QString )),this,SLOT(slotChangeSdep(QString))); QObject::connect(m_pUI->lineEditEdep, SIGNAL(textChanged( QString )),this,SLOT(slotChangeEdep(QString))); QObject::connect(m_pUI->lineEditSmallGrid, SIGNAL(textChanged( QString )),this,SLOT(slotChangeSmallGrid(QString))); QObject::connect(m_pUI->horizontalSliderSdep, SIGNAL(valueChanged(int)),this, SLOT(slotSetSdep(int))); QObject::connect(m_pUI->horizontalSliderEdep, SIGNAL(valueChanged(int)),this, SLOT(slotSetEdep(int))); m_SmallGrid=10; fmin=0,fmax=0; m_Xmin=0; m_Xmax=9999; m_Ymin=0; m_Ymax=100; m_Xmin2=0; m_Xmax2=0; m_DrawLjpl=0; QPalette pal; m_pUI->widgetPlot->setStyleSheet("background:lightgray"); m_pUI->widgetPlot->setPalette(pal); m_view.setParent(m_pUI->widgetPlot); QRect rec=m_pUI->widgetPlot->geometry(); m_view.widgetRec=QRect(0,0,rec.width(),rec.height()); val=NULL; } void CStatisticsDlg::slotSave() { // //保存位图,该部分需要罗林配合 // QString desktopPath=QDesktopServices::storageLocation(QDesktopServices::HomeLocation); // desktopPath=desktopPath+QString("/statistics.jpg"); // QString imagePath=QFileDialog::getSaveFileName(this,"(Save Image)",desktopPath,"JPG File(*.jpg)"); // if(imagePath.isEmpty()) // { // return; // } // QSize vSize=m_view.size(); // QPixmap image(vSize); // m_view.render(&image); // bool isSave=image.save(imagePath,"JPG"); // QMessageBox::information(this,"提示","图片保存成功!"); // //accept(); } /** *@brief 取消槽函数 */ void CStatisticsDlg::slotCancel() { delete []val; val=NULL; //reject (); } void CStatisticsDlg::slotCheckLjpl() { m_DrawLjpl=!m_DrawLjpl; m_view.m_DrawLjpl=m_DrawLjpl; m_view.update(); } void CStatisticsDlg::slotChangeName(const QString &text) { m_CurveName=text;//m_pUI->lineEditName->text(); m_view.m_CurveName=m_CurveName; m_view.update(); } void CStatisticsDlg::slotChangeUnit(const QString &text) { m_CurveUnit=text;//m_pUI->lineEditUnit->text(); m_view.m_CurveUnit=m_CurveUnit; m_view.update(); } void CStatisticsDlg::slotChangeXmin(const QString &text) { m_Xmin=text.toFloat(); Refurbish(); m_view.update(); } void CStatisticsDlg::slotChangeXmax(const QString &text) { m_Xmax=text.toFloat(); Refurbish(); m_view.update(); } void CStatisticsDlg::slotChangeXmin2(const QString &text) { m_Xmin2=text.toFloat(); Refurbish(); m_view.update(); } void CStatisticsDlg::slotChangeXmax2(const QString &text) { m_Xmax2=text.toFloat(); Refurbish(); m_view.update(); } void CStatisticsDlg::slotChangeYmin(const QString &text) { m_Ymin=text.toFloat(); Refurbish(); m_view.update(); } void CStatisticsDlg::slotChangeYmax(const QString &text) { m_Ymax=text.toFloat(); Refurbish(); m_view.update(); } void CStatisticsDlg::slotChangeSdep(const QString &text) { sdep=text.toFloat(); if(sdepm_flEnDepth)edep=m_flEnDepth; Refurbish(); m_view.update(); } void CStatisticsDlg::slotChangeSmallGrid(const QString &text) { m_SmallGrid=text.toInt(); if(m_SmallGrid<1) { m_SmallGrid=1; m_pUI->lineEditSmallGrid->setText(QString::number(m_SmallGrid)); } if(m_SmallGrid>10) { m_SmallGrid=10; m_pUI->lineEditSmallGrid->setText(QString::number(m_SmallGrid)); } Refurbish(); m_view.update(); } void CStatisticsDlg::slotSetSdep(const int &dep) { m_pUI->lineEditSdep->setText(QString::number(dep/100.)); } void CStatisticsDlg::slotSetEdep(const int &dep) { m_pUI->lineEditEdep->setText(QString::number(dep/100.)); } void CStatisticsDlg::init() { CLogIO logio(FileName.toStdString().c_str(),(unsigned int)CLogIO::modeReadWrite); int index=logio.OpenCurve(CurveName.toStdString().c_str()); if(index<0) return; logio.GetCurveInfo(index,&info); num=(info.EndDepth-info.StartDepth)/info.DepLevel+1.5; // value.reserve(num); val=new float[num]; logio.ReadCurve(index,info.StartDepth,num,&val[0]); logio.CloseCurve(index); logio.Close(); d_min=info.StartDepth; d_max=info.EndDepth; m_flEnDepth = d_max; m_flStDepth = d_min; sdep=d_min; edep=d_max; rlev=info.DepLevel; sample=num; m_CurveName=CurveName,m_CurveUnit="("+QLatin1String(info.Unit)+")"; m_pUI->lineEditName->setText(CurveName); QRegExp regExp("[A-Za-z0-9]{0,100}");//正则表达式,第一位数字为a-z的数字,第二位为1-9的数字,后边是0-2位0-9的数字 m_pUI->lineEditName->setValidator(new QRegExpValidator(regExp,this)); m_pUI->lineEditUnit->setText(m_CurveUnit); m_pUI->lineEditUnit->setValidator(new QRegExpValidator(regExp,this)); m_pUI->lineEditSdep1->setText(QString::number(sdep)); m_pUI->lineEditSdep1->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->lineEditEdep1->setText(QString::number(edep)); m_pUI->lineEditEdep1->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->horizontalSliderSdep->setRange(d_min*100,d_max*100); m_pUI->horizontalSliderSdep->setValue(d_min*100); m_pUI->horizontalSliderEdep->setRange(d_min*100,d_max*100); m_pUI->horizontalSliderEdep->setValue(d_max*100); m_pUI->lineEditSdep->setText(QString::number(sdep)); m_pUI->lineEditSdep->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->lineEditEdep->setText(QString::number(edep)); m_pUI->lineEditEdep->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->lineEditSmallGrid->setText(QString::number(m_SmallGrid)); m_pUI->lineEditSmallGrid->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); statistics(); m_Xmin=min; m_Xmax=max; m_pUI->lineEditXmin->setText(QString::number(min)); m_pUI->lineEditXmin->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->lineEditXmax->setText(QString::number(max)); m_pUI->lineEditXmax->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->lineEditYmin->setText(QString::number(m_Ymin)); m_pUI->lineEditYmin->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->lineEditYmax->setText(QString::number(m_Ymax)); m_pUI->lineEditYmax->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); Refurbish(); //初始化主频刻度范围:15%————85% int pp=0; for(int i=0;i<10*m_SmallGrid;i++) { pp+=point[i]; if((float)pp/(float)ShowPoint>=0.15) { m_Xmin2=m_Xmin+i*(m_Xmax-m_Xmin)/(10.*m_SmallGrid); ibegin=i; break; } } pp=0; for(int i=0;i<10*m_SmallGrid;i++) { pp+=point[i]; if((float)pp/(float)ShowPoint>=0.85) { m_Xmax2=m_Xmin+i*(m_Xmax-m_Xmin)/(10.*m_SmallGrid); iend=i; break; } } m_pUI->lineEditXmin2->setText(QString::number(m_Xmin2)); m_pUI->lineEditXmin2->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->lineEditXmax2->setText(QString::number(m_Xmax2)); m_pUI->lineEditXmax2->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); //频率刻度取整 if(fmax>50.)fmax=100.; else if(fmax>20.)fmax=50.; else if(fmax>10.)fmax=20.; else if(fmax>5.)fmax=10.; else fmax=5.; m_Ymax=fmax; m_Ymin=0; m_pUI->lineEditYmin->setText(QString::number(m_Ymin)); m_pUI->lineEditYmin->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); m_pUI->lineEditYmax->setText(QString::number(m_Ymax)); m_pUI->lineEditYmax->setValidator(new QDoubleValidator(-9999999,9999999,6,this)); //for plot m_view.m_CurveName=m_CurveName;m_view.m_CurveUnit=m_CurveUnit;//显示的曲线名称和单位 for(int i=0;i<100;i++)m_view.point[i]=point[i]; m_view.ShowPoint=ShowPoint; m_view.m_SmallGrid=m_SmallGrid; m_view.m_Ymax=m_Ymax; m_view.m_Xmin=m_Xmin,m_view.m_Xmax=m_Xmax; m_view.m_DrawLjpl=m_DrawLjpl; m_view.m_Xmin2=m_Xmin2,m_view.m_Xmax2=m_Xmax2; m_view.update(); } void CStatisticsDlg::statistics() { int ist=(sdep-d_min)/rlev+0.5; if(ist<0) ist=0; tpoint=(edep-sdep)/rlev; if(tpoint<0) return; sample=tpoint; min=99999;max=-99999; average=0; depmin=depmax=d_min; int InvalidNum=0; for(int i=ist;ival[i]){min=val[i];depmin=d_min+i*rlev;} if(maxInvalidNum)average/=(tpoint-InvalidNum); else average=val[ist+1]; float del=(m_Xmax-m_Xmin)/(10*m_SmallGrid);//del=(max-min)/(10*m_SmallGrid); for(int j=0;j<100;j++)point[j]=0; double vvv,v1,v2; Variance=0.; for(int i=ist+1;i=v1&&vvv<=v2) { point[j]++; break; } } else { if(vvv>v1&&vvv<=v2) { point[j]++; break; } }*/ if(vvv>v1&&vvv<=v2) { point[j]++; break; } } } if(tpoint>InvalidNum)Variance/=(tpoint-InvalidNum); else Variance=0; Variance=sqrt(Variance); int maxpoint=-1;//point[0]; ShowPoint=0;//point[0]; for(int j=0;j<10*m_SmallGrid;j++) { if(maxpointd_max) { AfxMessageBox("深度超界!"); return; } if(sdep>=edep)return; if(m_Xmin>=m_Xmax)return; if(m_Ymin>=m_Ymax)return; statistics(); QString str,jieguo; str="开始深度 : "+QString::number(sdep)+"(m)";jieguo="\r\n"+str; str="结束深度 : "+QString::number(edep)+"(m)";jieguo+="\r\n\r\n"+str; str="统计深度段 : "+QString::number(edep-sdep)+"(m)";jieguo+="\r\n\r\n"+str; str="有效数据点数 : "+QString::number(ShowPoint);jieguo+="\r\n\r\n"+str;//tpoint); str="最小值 : "+QString::number(min)+m_CurveUnit;jieguo+="\r\n\r\n"+str; str="最小值深度 : "+QString::number(depmin)+"(m)";jieguo+="\r\n\r\n"+str; str="最大值 : "+QString::number(max)+m_CurveUnit;jieguo+="\r\n\r\n"+str; str="最大值深度 : "+QString::number(depmax)+"(m)";jieguo+="\r\n\r\n"+str; str="平均值 : "+QString::number(average)+m_CurveUnit;jieguo+="\r\n\r\n"+str; str="最大频率 : "+QString::number(fmax);str+="(%)";jieguo+="\r\n\r\n"+str; str="最大频率数值范围 : "+QString::number(m_PVmin)+" -- "+QString::number(m_PVmax);jieguo+="\r\n\r\n"+str; str="标准偏差 : "+QString::number(Variance);jieguo+="\r\n\r\n"+str; m_pUI->textEditJieGuo->setText(jieguo); //for plot m_view.m_CurveName=m_CurveName;m_view.m_CurveUnit=m_CurveUnit;//显示的曲线名称和单位 for(int i=0;i<100;i++)m_view.point[i]=point[i]; m_view.ShowPoint=ShowPoint; m_view.m_SmallGrid=m_SmallGrid; m_view.m_Ymax=m_Ymax; m_view.m_Xmin=m_Xmin,m_view.m_Xmax=m_Xmax; m_view.m_DrawLjpl=m_DrawLjpl; m_view.m_Xmin2=m_Xmin2,m_view.m_Xmax2=m_Xmax2; } END_OSGGRAPHICS_NAMESPACE