412 lines
13 KiB
C++
412 lines
13 KiB
C++
#pragma warning(push,0)
|
||
// #include "Family.h"
|
||
#include <QMessageBox>
|
||
#include <QFileDialog>
|
||
#include <QPixmap>
|
||
#include <QDesktopServices>
|
||
#include <QRegExpValidator>
|
||
|
||
#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(sdep<m_flStDepth)sdep=m_flStDepth;
|
||
Refurbish();
|
||
m_view.update();
|
||
}
|
||
void CStatisticsDlg::slotChangeEdep(const QString &text)
|
||
{
|
||
edep=text.toFloat();
|
||
if(edep>m_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;i<ist+tpoint;i++)
|
||
{
|
||
if(val[i]==-9999.||val[i]==-999.25||val[i]==-99999.||val[i]==-9999.25)
|
||
{
|
||
InvalidNum++;
|
||
continue;
|
||
}
|
||
if(min>val[i]){min=val[i];depmin=d_min+i*rlev;}
|
||
if(max<val[i]){max=val[i];depmax=d_min+i*rlev;}
|
||
average+=val[i];
|
||
}
|
||
//剔除无效点
|
||
//average/=tpoint;
|
||
if(tpoint>InvalidNum)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<ist+tpoint;i++)
|
||
{
|
||
if(val[i]==-9999.||val[i]==-999.25||val[i]==-99999.||val[i]==-9999.25)continue;
|
||
Variance+=(val[i]-average)*(val[i]-average);
|
||
for(int j=0;j<10*m_SmallGrid;j++)
|
||
{
|
||
vvv=val[i],v1=m_Xmin+j*del,v2=m_Xmin+(float)(j+1)*del;
|
||
/*if(j==0)
|
||
{
|
||
if(vvv>=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(maxpoint<point[j])
|
||
{
|
||
maxpoint=point[j];
|
||
m_PVmin=m_Xmin+(float)j*del,m_PVmax=m_Xmin+(float)(j+1)*del;
|
||
}
|
||
ShowPoint+=point[j];
|
||
}
|
||
fmax=(float)maxpoint/(float)ShowPoint*100.;//(float)tpoint*100.;
|
||
}
|
||
/*
|
||
void CStatisticsDlg::slotRefurbish(const QString &text)
|
||
{
|
||
Refurbish();
|
||
m_view.update();
|
||
}
|
||
*/
|
||
void CStatisticsDlg::Refurbish()
|
||
{
|
||
if(sdep<d_min||edep>d_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
|