#include "CurveComputePage.h" #include "ui_CurveComputePage.h" #include "DataHelper.h" #include // #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;j0) { 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;iGetObjectType(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;iGetCurveInfo(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; klineEditeDep->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; klineeditsDep->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; iCloseCurve(index[i]); } mrw->CloseCurve(indexout); for(int j=0;jGetFileMessage(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; } }