logplus/DataMgr/src/Statistics2Dlg.cpp
2026-05-15 09:36:23 +08:00

483 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma warning(push,0)
// #include "Family.h"
#include <QMessageBox>
#include <QFileDialog>
#include <QPixmap>
#include <QDesktopServices>
#include <QtMath>
#include "Statistics2Dlg.h"
#include "ui_Statistics2.h"
#include "CStringType.h"
#include "Well.h"
#pragma warning(pop)
using namespace pai::ios::welllog;
BEGIN_OSGGRAPHICS_NAMESPACE
static float ReadSdep=9999999.,ReadEdep=-9999999;
CStatistics2Dlg::~CStatistics2Dlg()
{
if(m_pUI) delete m_pUI;
ReadSdep=9999999.,ReadEdep=-9999999;
}
CStatistics2Dlg::CStatistics2Dlg(QWidget * parent, Qt::WindowFlags flags)
: QWidget(parent,flags)//: QDialog(parent,flags)
{
m_pUI = new Ui_Statistics2();
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->okbtn_Refurbish, SIGNAL(clicked()), this, SLOT(slotRefurbish()));
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)));
//time
QObject::connect(m_pUI->lineEditStime, SIGNAL(textChanged( QString )),this,SLOT(slotChangeStime(QString)));
QObject::connect(m_pUI->lineEditEtime, SIGNAL(textChanged( QString )),this,SLOT(slotChangeEtime(QString)));
QObject::connect(m_pUI->horizontalSliderStime, SIGNAL(valueChanged(int)),this, SLOT(slotSetStime(int)));
QObject::connect(m_pUI->horizontalSliderEtime, SIGNAL(valueChanged(int)),this, SLOT(slotSetEtime(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;
val=NULL;
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());
}
void CStatistics2Dlg::slotSave()
{
// //保存位图,该部分需要罗林配合
// //QMessageBox::about(NULL,"提示","暂时未作");
// QString desktopPath=QDesktopServices::storageLocation(QDesktopServices::HomeLocation);
// desktopPath=desktopPath+QString("/Statistics2.jpg");
// QString imagePath=QFileDialog::getSaveFileName(this,"(Save Image)",desktopPath,"JPG File(*.jpg)");
// QSize vSize=m_view.size();
// QPixmap image(vSize);
// m_view.render(&image);
// bool isSave=image.save(imagePath,"JPG");
// QMessageBox::information(this,"提示","图片保存成功!");
// //accept();
}
/**
*@brief 取消槽函数
*/
void CStatistics2Dlg::slotCancel()
{
delete []val;
//reject ();
}
void CStatistics2Dlg::slotCheckLjpl()
{
m_DrawLjpl=!m_DrawLjpl;
m_view.m_DrawLjpl=m_DrawLjpl;
m_view.update();
}
void CStatistics2Dlg::slotChangeName(const QString &text)
{
m_CurveName=text;//m_pUI->lineEditName->text();
m_view.m_CurveName=m_CurveName;
m_view.update();
}
void CStatistics2Dlg::slotChangeUnit(const QString &text)
{
m_CurveUnit=text;//m_pUI->lineEditUnit->text();
m_view.m_CurveUnit=m_CurveUnit;
m_view.update();
}
void CStatistics2Dlg::slotChangeXmin(const QString &text)
{
m_Xmin=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeXmax(const QString &text)
{
m_Xmax=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeXmin2(const QString &text)
{
m_Xmin2=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeXmax2(const QString &text)
{
m_Xmax2=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeYmin(const QString &text)
{
m_Ymin=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeYmax(const QString &text)
{
m_Ymax=text.toFloat();
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeSdep(const QString &text)
{
sdep=text.toFloat();
if(sdep<m_flStDepth)sdep=m_flStDepth;
//Refurbish();
//m_view.update();
}
void CStatistics2Dlg::slotChangeEdep(const QString &text)
{
edep=text.toFloat();
if(edep>m_flEnDepth)edep=m_flEnDepth;
//Refurbish();
//m_view.update();
}
void CStatistics2Dlg::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 CStatistics2Dlg::slotSetSdep(const int &dep)
{
m_pUI->lineEditSdep->setText(QString::number(dep/100.));
}
void CStatistics2Dlg::slotSetEdep(const int &dep)
{
m_pUI->lineEditEdep->setText(QString::number(dep/100.));
}
//time
void CStatistics2Dlg::slotChangeStime(const QString &text)
{
stime=text.toFloat();
if(stime<m_flStTime)stime=m_flStTime;
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotChangeEtime(const QString &text)
{
etime=text.toFloat();
if(etime>m_flEndTime)etime=m_flEndTime;
Refurbish();
m_view.update();
}
void CStatistics2Dlg::slotSetStime(const int &time)
{
m_pUI->lineEditStime->setText(QString::number(time/100.));
}
void CStatistics2Dlg::slotSetEtime(const int &time)
{
m_pUI->lineEditEtime->setText(QString::number(time/100.));
}
//
void CStatistics2Dlg::init()
{
CLogIO logio(FileName.toStdString().c_str(),(unsigned int)CLogIO::modeReadWrite);
int index=logio.OpenWave(CurveName.toStdString().c_str());
if(index<0) return;
logio.GetWaveInfo(index,&info);
num=(info.EndDepth-info.StartDepth)/info.DepLevel+1.5;
logio.CloseWave(index);
logio.Close();
d_min=info.StartDepth;
d_max=info.EndDepth;
m_flEnDepth = d_max;
m_flStDepth = d_min;
rlev=info.DepLevel;
m_flStTime=info.StartTime;
m_flEndTime=info.StartTime+info.TimeSamples*info.TimeLevel;
m_CurveName=CurveName,m_CurveUnit="("+QLatin1String(info.Unit)+")";
m_pUI->lineEditName->setText(CurveName);
m_pUI->lineEditUnit->setText(m_CurveUnit);
m_pUI->lineEditSdep1->setText(QString::number(d_min));
m_pUI->lineEditEdep1->setText(QString::number(d_max));
m_pUI->horizontalSliderSdep->setRange(d_min*100,d_max*100);
m_pUI->horizontalSliderEdep->setRange(d_min*100,d_max*100);
if(num*info.TimeSamples<=100000)//当数据点较少时全部统计
{
sdep=d_min;
edep=d_max;
}
else//当数据点较多时统计中间的5000个深度点
{
int m_ShowDepPoint=100000./info.TimeSamples;
m_ShowDepPoint/=2;
sdep=d_min+(num/2.-m_ShowDepPoint)*rlev;
edep=sdep+2.*m_ShowDepPoint*rlev;
}
m_pUI->lineEditSdep->setText(QString::number(sdep));
m_pUI->lineEditEdep->setText(QString::number(edep));
m_pUI->horizontalSliderSdep->setValue(sdep*100);
m_pUI->horizontalSliderEdep->setValue(edep*100);
m_pUI->lineEditSmallGrid->setText(QString::number(m_SmallGrid));
//time
m_pUI->lineEditStime1->setText(QString::number(m_flStTime));
m_pUI->lineEditEtime1->setText(QString::number(m_flEndTime));
m_pUI->horizontalSliderStime->setRange(m_flStTime*100,m_flEndTime*100);
m_pUI->horizontalSliderEtime->setRange(m_flStTime*100,m_flEndTime*100);
stime=m_flStTime;etime=m_flEndTime;
m_pUI->lineEditStime->setText(QString::number(stime));
m_pUI->lineEditEtime->setText(QString::number(etime));
m_pUI->horizontalSliderStime->setValue(stime*100);
m_pUI->horizontalSliderEtime->setValue(etime*100);
//
Statistics2();
m_Xmin=min;
m_Xmax=max;
m_pUI->lineEditXmin->setText(QString::number(min));
m_pUI->lineEditXmax->setText(QString::number(max));
m_pUI->lineEditYmin->setText(QString::number(m_Ymin));
m_pUI->lineEditYmax->setText(QString::number(m_Ymax));
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->lineEditXmax2->setText(QString::number(m_Xmax2));
//频率刻度取整
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->lineEditYmax->setText(QString::number(m_Ymax));
//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 CStatistics2Dlg::Statistics2()
{
bool ReReadData=1;
d_min=sdep;
d_max=edep;
if(val!=NULL){
if((sdep>=ReadSdep&&sdep<=ReadEdep)&&(edep>=ReadSdep&&edep<=ReadEdep))ReReadData=0;}//如果要统计的深度在读取的深度范围内,就不在读数据
if(ReReadData)
{
CLogIO logio(FileName.toStdString().c_str(),(unsigned int)CLogIO::modeReadWrite);
int index=logio.OpenWave(CurveName.toStdString().c_str());
if(index<0) return;
if(val!=NULL)delete []val;
num=(edep-sdep)/rlev+1.5;
val=new float[num*info.TimeSamples];
logio.ReadWave(index,sdep,num,&val[0]);
logio.CloseWave(index);
logio.Close();
ReadSdep=sdep;
ReadEdep=edep;
}
int ist=(sdep-ReadSdep)/rlev+0.5;
int dpoint=(edep-sdep)/rlev+0.5;//深度点数
int timepoint=(etime-stime)/info.TimeLevel+0.5;
tpoint=dpoint*timepoint;
min=99999;max=-99999;
average=0;
depmin=depmax=d_min;
timemin=timemax=stime;
int InvalidNum=0;
for(int i=ist;i<ist+dpoint;i++)
{
for(int j=(stime-m_flStTime)/info.TimeLevel;j<(etime-m_flStTime)/info.TimeLevel;j++)
{
int pos=i*info.TimeSamples+j;
if(val[pos]==-9999.||val[pos]==-999.25||val[pos]==-99999.||val[pos]==-9999.25)
{
InvalidNum++;
continue;
}
if(min>val[pos]){min=val[pos];depmin=d_min+i*rlev;timemin=j*info.TimeLevel+m_flStTime;}
if(max<val[pos]){max=val[pos];depmax=d_min+i*rlev;timemax=j*info.TimeLevel+m_flStTime;}
average+=val[pos];
}
}
//剔除无效点
if(tpoint>InvalidNum)average/=(tpoint-InvalidNum);
else average=val[(ist+1)*info.TimeSamples+int((stime-m_flStTime)/info.TimeLevel+0.5)];
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;i<ist+dpoint;i++)
{
for(int k=(stime-m_flStTime)/info.TimeLevel;k<(etime-m_flStTime)/info.TimeLevel;k++)
{
int pos=i*info.TimeSamples+k;
if(val[pos]==-9999.||val[pos]==-999.25||val[pos]==-99999.||val[pos]==-9999.25)continue;
Variance+=(val[pos]-average)*(val[pos]-average);
for(int j=0;j<10*m_SmallGrid;j++)
{
vvv=val[pos],v1=m_Xmin+j*del,v2=m_Xmin+(float)(j+1)*del;
if(vvv>=v1&&vvv<=v2)
{
point[j]++;
break;
}
}
}
}
if(tpoint>InvalidNum)Variance/=(tpoint-InvalidNum);
else Variance=0;
Variance=qSqrt(Variance);
DWORD maxpoint=0;//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 CStatistics2Dlg::slotRefurbish()
{
Refurbish();
m_view.update();
}
void CStatistics2Dlg::Refurbish()
{
if(val==NULL)return;
/*sdep=m_pUI->lineEditSdep->text().toFloat();
edep=m_pUI->lineEditEdep->text().toFloat();
m_Xmin=m_pUI->lineEditXmin->text().toFloat();
m_Xmax=m_pUI->lineEditXmax->text().toFloat();
m_Xmin2=m_pUI->lineEditXmin2->text().toFloat();
m_Xmax2=m_pUI->lineEditXmax2->text().toFloat();
m_Ymin=m_pUI->lineEditYmin->text().toFloat();
m_Ymax=m_pUI->lineEditYmax->text().toFloat();
if(sdep<m_flStDepth)sdep=m_flStDepth;
if(edep>m_flEnDepth)edep=m_flEnDepth;
if(sdep>=edep)return;
if(m_Xmin>=m_Xmax)return;
if(m_Ymin>=m_Ymax)return;
m_SmallGrid=m_pUI->lineEditSmallGrid->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));
}*/
if(sdep>=edep)return;
if(m_Xmin>=m_Xmax)return;
if(m_Ymin>=m_Ymax)return;
Statistics2();
QString str,jieguo;
str="开始深度 : "+QString::number(sdep)+"("+QLatin1String(info.DepthUnit)+")";jieguo="\r\n"+str;
str="结束深度 : "+QString::number(edep)+"("+QLatin1String(info.DepthUnit)+")";jieguo+="\r\n\r\n"+str;
str="统计深度段: "+QString::number(edep-sdep)+"("+QLatin1String(info.DepthUnit)+")";jieguo+="\r\n\r\n"+str;
str="开始时间 : "+QString::number(stime)+"("+QLatin1String(info.TimeUnit)+")";jieguo+="\r\n\r\n"+str;
str="结束时间 : "+QString::number(etime)+"("+QLatin1String(info.TimeUnit)+")";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)+"("+QLatin1String(info.DepthUnit)+"),"+QString::number(timemin)+"("+QLatin1String(info.TimeUnit)+")";jieguo+="\r\n\r\n"+str;
str="最大值 : "+QString::number(max)+m_CurveUnit;jieguo+="\r\n\r\n"+str;
str="最大值深度、时间 : "+QString::number(depmax)+"("+QLatin1String(info.DepthUnit)+"),"+QString::number(timemax)+"("+QLatin1String(info.TimeUnit)+")";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