logplus/DataMgr/src/CurveComputePage.cpp
2026-01-29 16:57:06 +08:00

295 lines
8.9 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.

#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;
}
}