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

362 lines
12 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 <QHeaderView>
#include "CurveComputerDlg.h"
#include "ui_CurveComputer.h"
#include "CStringType.h"
#include "DataHelper.h"
#include "MemRdWt.h"
// #include "ObjProject.h"
#include "Well.h"
#pragma warning(pop)
using namespace pai::ios::welllog;
BEGIN_OSGGRAPHICS_NAMESPACE
CCurveComputerDlg::CCurveComputerDlg(QWidget * parent, Qt::WindowFlags flags)
: QDialog(parent,flags)
{
m_pUI = new Ui_CurveComputer();
m_pUI->setupUi(this);
QObject::connect(m_pUI->pushButton_SetDepth, SIGNAL(clicked()), this, SLOT(slotSetDepth()));
QObject::connect(m_pUI->pushButton_SetFun, SIGNAL(clicked()), this, SLOT(slotSetFun()));
QObject::connect(m_pUI->okbtn, SIGNAL(clicked()), this, SLOT(slotSave()));
QObject::connect(m_pUI->cancelbtn, SIGNAL(clicked()), this, SLOT(slotCancel()));
}
void CCurveComputerDlg::slotSave()
{
//检查公式合理性
for(int i=0;i<m_pUI->tableWidget->rowCount();i++)
{
if(Qt::Checked!=m_pUI->tableWidget->item(i,0)->checkState())continue;
QString m_Function=m_pUI->tableWidget->item(i,0)->text();
m_Function=m_Function.toUpper();
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;
float CurveValue;
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;
}
}
//检查输入、输出曲线
CMemRdWt *mrw=new CMemRdWt();
char name[64];
if(!mrw->Open(FileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete mrw;
return;
}
Slf_FILE_MESSAGE msag;
mrw->GetFileMessage(msag);
for(int m=0;m<m_pUI->tableWidget->rowCount();m++)
{
if(Qt::Checked!=m_pUI->tableWidget->item(m,0)->checkState())continue;
QString m_Function=m_pUI->tableWidget->item(m,0)->text();
m_Function=m_Function.toUpper();
Function fun;
int noi=fun.GetExpress(m_Function);
strcpy(name,fun.csOutName.toStdString().c_str());
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 ;
}
}
//检查输入曲线
int index[20],indexout;
for(int i=0;i<noi;i++)
{
if(fun.csName[i]=="CURRENT_HD.DEP")continue;
if(mrw->FindObjectIndex(fun.csName[i].toStdString().c_str())<0)
{
QMessageBox::warning(NULL,"提示","输入曲线"+fun.csName[i]+"不存在,无法进行计算!!!");
delete mrw;
return ;
}
if(mrw->GetObjectType(fun.csName[i].toStdString().c_str())!=CURVE_OBJECT)
{
QMessageBox::warning(NULL,"提示","输入曲线"+fun.csName[i]+"不是曲线类型,不能进行计算!!!\r\n请参考常规曲线计算规则,输入正确的计算公式");
delete mrw;
return ;
}
}
}
QStringList CurveNames;
CurveNames.push_back(msag.WellName);
CurveNames.push_back(FileName);
//开始计算
for(int m=0;m<m_pUI->tableWidget->rowCount();m++)
{
if(Qt::Checked!=m_pUI->tableWidget->item(m,0)->checkState())continue;
QString m_Function=m_pUI->tableWidget->item(m,0)->text();
m_Function=m_Function.toUpper();
Function fun;
int noi=fun.GetExpress(m_Function);
strcpy(name,fun.csOutName.toStdString().c_str());
CurveNames.push_back(name);
for(int j=0;j<noi;j++)
{
fun.val[j]=j+1;
}
fun.prog=fun.TempProg;
float CurveValue;
//int re=fun.get_exp(&CurveValue);
int in=mrw->FindObjectIndex(name);
int index[20],indexout=-1;
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;
index[i]=mrw->OpenCurve(fun.csName[i].toStdString().c_str());
if(index[i]>-1)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“深度”标识
//生成输出曲线
indexout=mrw->OpenCurve(fun.csOutName.toStdString().c_str());
if(indexout>=0)mrw->GetCurveInfo(indexout,&info);
else
{//输出曲线不存在
indexout=-1;
for(int i=0;i<noi;i++)
{
if(fun.csName[i]=="CURRENT_HD.DEP")continue;
mrw->GetCurveInfo(index[i],&info);//根据第一条输入曲线的属性产生输出曲线
indexout=i;
break;
}
if(indexout==-1)//表达式中没有实际曲线
{
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,"");
}
sprintf(info.AliasName,"%s",fun.csOutName.toStdString().c_str());
sprintf(info.Name,"%s",fun.csOutName.toStdString().c_str());
info.StartDepth=m_pUI->tableWidget->item(m,1)->text().toFloat();
info.EndDepth=m_pUI->tableWidget->item(m,2)->text().toFloat();
indexout=mrw->OpenCurve(&info);
}
float rlev = info.DepLevel;
float sdep = m_pUI->tableWidget->item(m,1)->text().toFloat();
float edep = m_pUI->tableWidget->item(m,2)->text().toFloat();
if(MinRlev>rlev)MinRlev=rlev;
int sample=(int)((edep-sdep)/rlev+1.5);//0.5);
int sampleIn=(int)((edep-sdep)/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]=(edep-sdep)/CurveRlev[j]+1.5;//0.5;
mrw->ReadCurve(index[j],sdep,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++)
{
//sdep = sdeps + rlev * i;
for(int j=0;j<noi;j++)
{
if(fun.csName[j]=="CURRENT_HD.DEP")fun.val[j]=sdep+i*rlev;
else fun.val[j]=indata[j][i];
}
fun.prog=fun.TempProg;
fun.get_exp(&CurveValue);
outdata[i]=CurveValue;
//2013.11.20 whp add for 为曲线计算添加数值类型选项常规不控制数值大小方位控制到0-360
}
mrw->WriteCurve(indexout,sdep,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;
}
delete mrw;
// PaiObject::m_EventAgent.ObjectPropertyChanged(GetProject(),"Compute",CurveNames);
QMessageBox::warning(NULL,"提示","完成曲线计算");
//accept();
}
/**
*@brief 取消槽函数
*/
void CCurveComputerDlg::slotCancel()
{
// reject ();
}
void CCurveComputerDlg::slotSetDepth()//用当前编辑的曲线深度为所有计算曲线设置深度
{
QString sdep=m_pUI->lineEdit_Sdep->text();
QString edep=m_pUI->lineEdit_Edep->text();
if(sdep>edep) sdep=edep;
for(int i=0;i<m_pUI->tableWidget->rowCount();i++)
{
m_pUI->tableWidget->setItem(i,1,new QTableWidgetItem(sdep));
m_pUI->tableWidget->setItem(i,2,new QTableWidgetItem(edep));
}
}
void CCurveComputerDlg::slotSetFun()
{
QString m_Function="X="+m_pUI->lineEdit_Fun->text();
m_Function=m_Function.toUpper();
m_Function.replace("\"DEPTH\"","CURRENT_HD.DEP");
Function fun;
vector <int>NameType;//输入曲线名类型
int noi=fun.GetExpress(m_Function);
QString m_FunctionR=m_Function.right(m_Function.length()-m_Function.indexOf('=')-1);
for (int i=0; i<noi; i++)
{
if(fun.csName[i]=="X")NameType.push_back(1);//和输出曲线同名
else if(fun.csName[i]=="CURRENT_HD.DEP")NameType.push_back(2);//深度变量
else NameType.push_back(0);//曲线名
}
for(int i=0;i<m_pUI->tableWidget->rowCount();i++)
{
QString m_Function0=m_pUI->tableWidget->item(i,0)->text();
m_Function0=m_Function0.toUpper();
QString outname=m_Function0.left(m_Function0.indexOf('='));
QString newfun=QString(QLatin1String(fun.TempProg));
newfun=newfun.simplified();
char name[2];
name[0]='A'+ i;
name[1]=0;
for (int j=0; j<noi; j++)
{
name[0]='A'+ j;
QString qname=QString(QLatin1String(name));
//if(NameType[j])
{
QString left=newfun.left(newfun.lastIndexOf(qname));
QString right=newfun.right(newfun.length()-newfun.lastIndexOf(qname)-1);
//right.replace(qname,outname);
QString ms=fun.csName[j];//曲线名
if(NameType[j]==1)ms=outname;//和输出曲线同名
else if(NameType[j]==2)ms="\"DEPTH\"";//深度变量
newfun=left+ms+right;
}
}
QString ss=outname+"="+newfun;
m_pUI->tableWidget->setItem(i,0,new QTableWidgetItem(ss));//QString(QLatin1String(fun.TempProg))));
m_pUI->tableWidget->item(i,0)->setCheckState(Qt::Checked);
}
}
void CCurveComputerDlg::init()//const QString& FileName,const QStringList& CurveNameList)//int row,int col,QStringList header)
{
m_pUI->tableWidget->setColumnCount(3);
QStringList header;
header<<"计算公式"<<"起始深度"<<"终止深度";//header<<"曲线名"<<"计算公式"<<"起始深度"<<"终止深度";
m_pUI->tableWidget->setHorizontalHeaderLabels(header);
m_pUI->tableWidget->setColumnWidth(1,200);
m_pUI->tableWidget->horizontalHeader()->setStretchLastSection(true);
m_pUI->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
m_pUI->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
// m_pUI->tableWidget->horizontalHeader()->setResizeMode(2, QHeaderView::ResizeToContents);
m_pUI->tableWidget->setRowCount(CurveNameList.count());
float Mindep=99999,Maxdep=-99999;
for(int i=0;i<CurveNameList.count();i++)
{
QString CurveName=CurveNameList[i];
//m_pUI->tableWidget->setItem(i,0,new QTableWidgetItem(CurveName));
QString ss=CurveName+"=1.0*"+CurveName+"+0.0";
m_pUI->tableWidget->setItem(i,1-1,new QTableWidgetItem(ss));
CMemRdWt *logio=new CMemRdWt();
logio->Open(FileName.toStdString().c_str(),CSlfIO::modeReadWrite);
int index=logio->OpenCurve(CurveName.toStdString().c_str());
if(index<0) {
delete logio;
continue;
}
Slf_CURVE pInfo;
logio->GetCurveInfo(index,&pInfo);
m_pUI->tableWidget->setItem(i,2-1,new QTableWidgetItem(QString::number(pInfo.StartDepth)));
m_pUI->tableWidget->setItem(i,3-1,new QTableWidgetItem(QString::number(pInfo.EndDepth)));
if(Mindep>pInfo.StartDepth)Mindep=pInfo.StartDepth;
if(Mindep>pInfo.EndDepth)Mindep=pInfo.EndDepth;
if(Maxdep<pInfo.StartDepth)Maxdep=pInfo.StartDepth;
if(Maxdep<pInfo.EndDepth)Maxdep=pInfo.EndDepth;
logio->CloseCurve(index);
delete logio;
m_pUI->tableWidget->item(i,0)->setCheckState(Qt::Checked);
}
m_pUI->lineEdit_Sdep->setText(QString::number(Mindep));
m_pUI->lineEdit_Edep->setText(QString::number(Maxdep));
QString ss="1.0*x+0.0";
m_pUI->lineEdit_OutCurve->setText("x");
m_pUI->lineEdit_Fun->setText(ss);
}
END_OSGGRAPHICS_NAMESPACE