295 lines
8.9 KiB
C++
295 lines
8.9 KiB
C++
#include "CurveComputePage.h"
|
||
#include "ui_CurveComputePage.h"
|
||
#include "DataHelper.h"
|
||
#include <QDoubleValidator>
|
||
// #include "DataImport.h"
|
||
// #include "ObjProject.h"
|
||
CurveComputePage::CurveComputePage(QWidget *parent)
|
||
: QWidget(parent)
|
||
{
|
||
m_pUI=new Ui::CurveComputePage();
|
||
m_pUI->setupUi(this);
|
||
if(NULL != parent)
|
||
{
|
||
int w=width();
|
||
int h=height();
|
||
parent->setFixedSize(QSize(w,h));
|
||
|
||
}
|
||
|
||
}
|
||
void CurveComputePage::CurveCompute(const QString& FileName,
|
||
const QStringList& CurveNameList)
|
||
{
|
||
m_FileName=FileName;
|
||
m_cureNameList=CurveNameList;
|
||
}
|
||
|
||
void CurveComputePage::init()
|
||
{
|
||
setWindowTitle(QString("曲线计算"));
|
||
if(m_cureNameList.size()>0)
|
||
{
|
||
QString CurveName=m_cureNameList[0];
|
||
CMemRdWt *mrw=new CMemRdWt();
|
||
mrw->Open(m_FileName.toStdString().c_str(),CSlfIO::modeReadWrite);
|
||
int index=mrw->OpenCurve(CurveName.toStdString().c_str());
|
||
if(index<0) {
|
||
delete mrw;
|
||
return;
|
||
}
|
||
Slf_CURVE pInfo;
|
||
mrw->GetCurveInfo(index,&pInfo);
|
||
delete mrw;
|
||
//开始深度
|
||
m_pUI->lineeditsDep->setText(QString::number(pInfo.StartDepth));
|
||
m_pUI->lineeditsDep->setValidator(new QDoubleValidator(-999999,999999,6,this));
|
||
// 终止深度
|
||
m_pUI->lineEditeDep->setText(QString::number(pInfo.EndDepth));
|
||
m_pUI->lineEditeDep->setValidator(new QDoubleValidator(-999999,999999,6,this));
|
||
//计算公式
|
||
QString ss=CurveName+"=1.0*"+CurveName+"+0.0";
|
||
m_pUI->lineEditExpress->setText(ss);
|
||
disconnect(m_pUI->btnOk,SIGNAL(clicked()),this,SLOT(slotComputeOk()));
|
||
connect(m_pUI->btnOk,SIGNAL(clicked()),this,SLOT(slotComputeOk()));
|
||
}
|
||
}
|
||
void CurveComputePage::slotComputeOk()
|
||
{
|
||
if(m_pUI->lineeditsDep->text().toFloat()>m_pUI->lineEditeDep->text().toFloat())
|
||
{
|
||
AfxMessageBox("起始深度不能大于终止深度");
|
||
return;
|
||
}
|
||
QString m_Function=m_pUI->lineEditExpress->text();
|
||
m_Function.toUpper();
|
||
m_Function.replace("\"DEPTH\"","CURRENT_HD.DEP");
|
||
BOOL OutCurveExist=1;
|
||
float CurveValue,sdep,edep,rlev;
|
||
Function fun;
|
||
int noi=fun.GetExpress(m_Function);
|
||
if(noi<0)
|
||
{
|
||
return ;//输入公式中没有“=”号,或含有不能处理的字符
|
||
}
|
||
//检查公式合理性
|
||
for(int j=0;j<noi;j++)
|
||
{
|
||
fun.val[j]=j+1;
|
||
}
|
||
fun.prog=fun.TempProg;
|
||
int re=fun.get_exp(&CurveValue);
|
||
if(re>0)
|
||
{
|
||
const static char *e[]={
|
||
"语法错误",//"syntax error.",
|
||
"不对称的括号",//"unbalanced parentheses",
|
||
"非法运算符"//"no expression present"
|
||
};
|
||
QMessageBox::warning(NULL,"提示",QString(QLatin1String(e[re-1]))+m_Function);
|
||
return ;
|
||
}
|
||
char name[20];
|
||
strcpy(name,fun.csOutName.toStdString().c_str());
|
||
CMemRdWt *mrw=new CMemRdWt();
|
||
mrw->Open(m_FileName.toStdString().c_str(),CSlfIO::modeReadWrite);
|
||
int in=mrw->FindObjectIndex(name);
|
||
if(in>=0)
|
||
{
|
||
short Attribute,SubAttribute;
|
||
mrw->GetObjectAttribute(in,&Attribute,&SubAttribute);
|
||
if(mrw->GetObjectStatus(in)!=0)//删除状态
|
||
{
|
||
if(Attribute==CHANNEL_OBJECT&&SubAttribute==CURVE_OBJECT)
|
||
{
|
||
QMessageBox::warning(NULL,"提示",fun.csOutName+"曲线已存在,但该曲线处于删除状态,无法进行计算 !!!");
|
||
delete mrw;
|
||
return ;
|
||
}
|
||
else
|
||
{
|
||
QMessageBox::warning(NULL,"提示","有一个非曲线对象"+fun.csOutName+"已存在,且该对象处于删除状态,无法进行计算 !!!");
|
||
delete mrw;
|
||
return ;
|
||
}
|
||
}
|
||
if (Attribute!=CHANNEL_OBJECT||SubAttribute!=CURVE_OBJECT)
|
||
{
|
||
QMessageBox::warning(NULL,"提示",fun.csOutName+"对象已存在,但其属性不是曲线 !!!");
|
||
delete mrw;
|
||
return ;
|
||
}
|
||
}
|
||
else
|
||
{ // 输出曲线不存在
|
||
QString ss="输出曲线"+fun.csOutName+"不存在 \n 是否生成 ?\n";
|
||
int flag = QMessageBox::warning(NULL,tr("提示"),ss,QMessageBox::Yes,QMessageBox::No);
|
||
if(flag != QMessageBox::Yes){
|
||
delete mrw;
|
||
return ;
|
||
}
|
||
OutCurveExist=0;
|
||
}
|
||
int index[20],indexout;
|
||
float MinRlev=9999;
|
||
DWORD CurveSample[20];
|
||
float CurveRlev[20];
|
||
Slf_CURVE info;
|
||
for(int i=0;i<noi;i++)
|
||
{
|
||
if(fun.csName[i]=="CURRENT_HD.DEP")continue;
|
||
if(mrw->GetObjectType(fun.csName[i].toStdString().c_str())!=CURVE_OBJECT)
|
||
{
|
||
QMessageBox::warning(NULL,"提示","输入曲线"+fun.csName[i]+"不是曲线类型,不能进行计算!!!\r\n请参考常规曲线计算规则,输入正确的计算公式");
|
||
delete mrw;
|
||
return ;
|
||
}
|
||
index[i]=mrw->OpenCurve(fun.csName[i].toStdString().c_str());
|
||
if(index[i]<0)
|
||
{
|
||
QMessageBox::warning(NULL,"提示","打开曲线"+fun.csName[i]+"出错,不能进行计算!!!");
|
||
delete mrw;
|
||
return ;
|
||
}
|
||
mrw->GetCurveInfo(index[i],&info);
|
||
if(MinRlev>info.DepLevel)MinRlev=info.DepLevel;
|
||
CurveRlev[i]=info.DepLevel;
|
||
}
|
||
if(MinRlev==9999)MinRlev=0.125;//表达式中没有实际曲线,只有CURRENT_HD.DEP“深度”标识
|
||
//生成输出曲线
|
||
|
||
if(OutCurveExist==0)
|
||
{
|
||
indexout=-1;
|
||
for(int i=0;i<noi;i++)
|
||
{
|
||
if(fun.csName[i]=="CURRENT_HD.DEP")continue;
|
||
mrw->GetCurveInfo(index[i],&info);
|
||
sprintf(info.AliasName,"%s",fun.csOutName.toStdString().c_str());
|
||
sprintf(info.Name,"%s",fun.csOutName.toStdString().c_str());
|
||
info.StartDepth=m_pUI->lineeditsDep->text().toFloat();
|
||
info.EndDepth=m_pUI->lineEditeDep->text().toFloat();
|
||
indexout=mrw->OpenCurve(&info);
|
||
break;
|
||
}
|
||
if(indexout==-1)//表达式中没有实际曲线,只有CURRENT_HD.DEP“深度”标识
|
||
{
|
||
sprintf(info.AliasName,"%s",fun.csOutName.toStdString().c_str());
|
||
sprintf(info.Name,"%s",fun.csOutName.toStdString().c_str());
|
||
info.StartDepth=m_pUI->lineeditsDep->text().toFloat();
|
||
info.EndDepth=m_pUI->lineEditeDep->text().toFloat();
|
||
info.DepLevel=0.125;
|
||
info.CodeLen=4;
|
||
info.RepCode=4;
|
||
info.DefVal=-999.25;
|
||
info.MaxValue=100;
|
||
info.MinValue=0;
|
||
strcpy(info.DepthHZUnit,"米");
|
||
strcpy(info.DepthUnit,"m");
|
||
strcpy(info.Unit,"");
|
||
strcpy(info.AliasUnit,"");
|
||
indexout=mrw->OpenCurve(&info);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
indexout=mrw->OpenCurve(fun.csOutName.toStdString().c_str());
|
||
if(indexout>-1) mrw->GetCurveInfo(indexout,&info);
|
||
}
|
||
if(indexout<0)
|
||
{
|
||
QMessageBox::warning(NULL,"提示","输出曲线不存在,而且输入曲线中没有可参考的常规曲线,无法进行曲线计算\r\n请参考常规曲线计算规则,输入正确的计算公式");
|
||
delete mrw;
|
||
return ;
|
||
}
|
||
//检查输出曲线深度
|
||
rlev = info.DepLevel;
|
||
sdep = info.StartDepth;
|
||
edep = info.EndDepth ;
|
||
if(MinRlev>rlev)MinRlev=rlev;
|
||
if ( m_pUI->lineeditsDep->text().toFloat() < sdep-rlev || m_pUI->lineEditeDep->text().toFloat() > edep+rlev)
|
||
{
|
||
int flag=QMessageBox::warning(NULL,"提示","输出曲线的深度范围("+m_pUI->lineeditsDep->text()+"--"+m_pUI->lineEditeDep->text()+")超出输入曲线("+QString::number(sdep)+"--"+QString::number(edep)+"\n继续计算吗?",QMessageBox::Yes,QMessageBox::No);
|
||
if(flag != QMessageBox::Yes){
|
||
delete mrw;
|
||
return ;
|
||
}
|
||
}
|
||
int sample=(int)((m_pUI->lineEditeDep->text().toFloat()-m_pUI->lineeditsDep->text().toFloat())/rlev+1.5);//0.5);
|
||
int sampleIn=(int)((m_pUI->lineEditeDep->text().toFloat()-m_pUI->lineeditsDep->text().toFloat())/MinRlev+1.5);//0.5);
|
||
float **indata,*outdata;
|
||
indata=new float*[noi];
|
||
outdata=new float[sample+10];
|
||
float *tDep,*aDep;
|
||
tDep=new float[sample];
|
||
for(int k=0; k<sample; k++) tDep[k]=sdep+k*rlev;
|
||
for(int j=0;j<noi;j++)
|
||
{
|
||
if(fun.csName[j]=="CURRENT_HD.DEP")continue;
|
||
indata[j]=new float[sampleIn];
|
||
//whp change 2018.10.15 保证读写一致
|
||
CurveSample[j]=(m_pUI->lineEditeDep->text().toFloat()-m_pUI->lineeditsDep->text().toFloat())/CurveRlev[j]+1.5;//0.5;
|
||
mrw->ReadCurve(index[j],m_pUI->lineeditsDep->text().toFloat(),CurveSample[j],&indata[j][0]);
|
||
if(fabs(CurveRlev[j]-rlev)/rlev>0.1)
|
||
{
|
||
aDep=new float[CurveSample[j]];
|
||
for(int k=0; k<CurveSample[j]; k++) aDep[k]=sdep+k*CurveRlev[j];
|
||
Resample::ReSampling(&indata[j][0],CurveSample[j],1,aDep,tDep,sample);
|
||
delete []aDep;
|
||
}
|
||
}
|
||
for (int i=0; i<sample; i++)
|
||
{
|
||
float sdeps = sdep + rlev * i;
|
||
float val=0;
|
||
for(int j=0;j<noi;j++)
|
||
{
|
||
if(fun.csName[j]=="CURRENT_HD.DEP")fun.val[j]=m_pUI->lineeditsDep->text().toFloat()+i*rlev;
|
||
else fun.val[j]=indata[j][i];
|
||
if(fun.val[j]==-9999||fun.val[j]==-999.25||fun.val[j]==-99999||fun.val[j]==-4.3160208e+008) val=-9999;
|
||
}
|
||
fun.prog=fun.TempProg;
|
||
fun.get_exp(&CurveValue);
|
||
if(val==-9999) CurveValue=-9999;
|
||
outdata[i]=CurveValue;
|
||
}
|
||
mrw->WriteCurve(indexout,m_pUI->lineeditsDep->text().toFloat(),sample,&outdata[0]);
|
||
delete []tDep;
|
||
|
||
for (int i=0; i<noi;i++)
|
||
{
|
||
if(fun.csName[i]=="CURRENT_HD.DEP")continue;
|
||
mrw->CloseCurve(index[i]);
|
||
}
|
||
mrw->CloseCurve(indexout);
|
||
|
||
for(int j=0;j<noi;j++)
|
||
{
|
||
if(fun.csName[j]=="CURRENT_HD.DEP")continue;
|
||
delete indata[j];
|
||
}
|
||
delete []indata;
|
||
delete []outdata;
|
||
|
||
////
|
||
Slf_FILE_MESSAGE msag;
|
||
mrw->GetFileMessage(msag);
|
||
|
||
QStringList CurveNames;
|
||
CurveNames.push_back(msag.WellName);
|
||
CurveNames.push_back(m_FileName);
|
||
CurveNames.push_back(fun.csOutName.toUpper());
|
||
delete mrw;
|
||
emit signalCompute(CurveNames);
|
||
// PaiObject::m_EventAgent.ObjectPropertyChanged(::GetProject(),"Compute",CurveNames);
|
||
}
|
||
|
||
CurveComputePage::~CurveComputePage()
|
||
{
|
||
if(NULL != m_pUI)
|
||
{
|
||
delete m_pUI;
|
||
m_pUI=NULL;
|
||
}
|
||
}
|