#include "DataHelper.h" #include #include "cdialog.h" #include "GeometryUtils.h" // #include "DataImport.h" // #include "ObjProject.h" #include "BaseFun.h" //DEFAULTTABLE DefauleTable[DefTabNum]; DEFAULTTABLE *DefauleTable=NULL; int DefTabNum=0; bool DataHelper::m_IsGc=true;//false; DataHelper::DataHelper() { } DataHelper::~DataHelper() { } //whp change 2020.3.9 for 统一离散数据入口 //QStringList DataHelper::GetVlidTable(QStringList listFiles) QStringList DataHelper::GetVlidTable(int curitemType,QStringList listFiles,QStringList &BadlistFiles) { int BadFileNum=0; QStringList myListFile,BadListFile; QString mes=""; char *pLine=new char[50000]; foreach(QString strFileName, listFiles) { QFile file(strFileName); if (!file.open(QIODevice::ReadOnly )){mes+=QString::fromLocal8Bit("无法打开文件");mes+=strFileName;mes+="\r\n";continue;} file.readLine(pLine,50000); QByteArray line=pLine; line=line.simplified(); while(IsNullLine(line)){ file.readLine(pLine,50000); line=pLine; } QStringList StrList,StrListZD=GetStringList(line);//line.split(","); int NumLine=0; int ColNum=StrListZD.size();//列数 int InvalidLineNum=0;//无效行,即数据列数和首行不一致 // QString mes1="\r\n"+strFileName+QString::fromLocal8Bit("数据表中各行字段数不一致\r\n首行字段数=")+QString::number(ColNum); QString mes1="\r\n"+QString::number(BadFileNum+1)+"、"+strFileName+"\r\n"+QString::fromLocal8Bit("数据行字段数大于字段名个数\r\n首行字段数=")+QString::number(ColNum); //if(BadFileNum==10)mes1="............"; if(ColNum<=1)mes1="\r\n"+QString::number(BadFileNum+1)+"、"+strFileName+"\r\n"+QString::fromLocal8Bit("首行字段数=")+QString::number(ColNum); if(BadFileNum>5)mes1=""; //whp add 3.13 for 多井时检测井名有效性 bool IsDwell=0; if(StrListZD.at(0).toUpper().indexOf("WELLNAME")>=0)IsDwell=1; if(curitemType&&IsDwell)//whp 2020.3.23 for 选择单井导入时不导入多井数据 { BadFileNum++; BadListFile.append(strFileName); file.close(); continue; } while(!file.atEnd()) { file.readLine(pLine,50000); QByteArray line=pLine; line=line.simplified(); if(line=="")continue; if(IsNullLine(line))continue; StrList=GetStringList(line); if(InvalidLineNum<10) { if(StrList.size()>ColNum)//if(StrList.size()!=ColNum)允许缺失后面数据,不允许数据个数大于字段名个数 { InvalidLineNum++; if(BadFileNum<=5)mes1=mes1+QString::fromLocal8Bit("\r\n第")+QString::number(NumLine+1)+QString::fromLocal8Bit("行字段数=")+QString::number(StrList.size()); } } //whp add 3.13 for 多井时检测井名有效性 if(!InvalidLineNum) { if(IsDwell) { if(IsValidWellName(StrList.at(0))==0) { QString ss=StrList.at(0); InvalidLineNum++; } } } NumLine++; if(InvalidLineNum)break; } if(InvalidLineNum>0||ColNum<=1) { mes+=mes1;//无效的表数据,不再显示 BadFileNum++; BadListFile.append(strFileName); } else myListFile.append(strFileName); file.close(); } delete pLine; BadlistFiles=BadListFile;//whp add 2020.3.9 for 统一离散数据入口 return myListFile; } int DataHelper::StrType(QString str) { QByteArray ba = str.toLatin1();//QString 转换为 char* const char *buf = ba.data(); int len=strlen(str.toStdString().c_str());//str.length();//whp change 2020.3.16 int dig[30]; int DotNum=0;//小数点个数 BOOL IsDigital=1; for(int i=0;i1){IsDigital=0;break;} } if(!IsDigital)return 6;//字符串 else if(DotNum)return 4;//浮点数 else return 1;//整形数 } DEFAULTTABLE DataHelper::SetTableInf(QString TableName,QString TableHzName,int num,QStringList ZdName,QStringList HzName,QStringList ZdUnit,QStringList ZdType,QStringList ZdLen,QStringList ZdRes) { DEFAULTTABLE DefTable; DefTable.TableName=TableName; DefTable.TableAliasName=TableHzName; DefTable.ZdNum=num; DefTable.tinfo=new Slf_OBJECT_FIELD[num]; for(int i=0;i=0)continue; if(line.indexOf("#")>=0) { DefTabNum++; } } if(!DefTabNum) { QMessageBox::warning(NULL,"提示","缺省表配置文件"+ConfigName+"中定义表数为0"); return ; } DefauleTable=new DEFAULTTABLE[DefTabNum+1]; InFile.seek(0); QString TableName,TableAliasName; //int ZdNum; QStringList ZdName,HzName,ZdUnit,ZdLen,ZdType,ZdRes,DataList; DefTabNum=0; line=textstream.readLine(5000); // line = line.toUpper(); while(!textstream.atEnd()) { line=textstream.readLine(5000); while(line.indexOf("#")>=0) { line=line.replace("#",""); DataList=GetStringList(line,1,1,1,1,1); if(DataList.count()<2)continue; TableName=DataList.at(0); TableAliasName=DataList.at(1); while(!textstream.atEnd()) { line=textstream.readLine(5000); if(line.indexOf(",")>=0) { continue;//枚举行 } // line=line.toUpper(); if(line.indexOf("#")>=0) { break; } DataList=GetStringList(line,1,1,1,1,1); if(DataList.count()<5)continue; ZdName.append(DataList.at(0).toUpper()); HzName.append(DataList.at(1).toUpper()); ZdUnit.append(DataList.at(2)); bool IsZdType=0; for(int j=0;j<11;j++) { if(DataList.at(3).toUpper()==QString(Rep_STR[j])) { ZdType.append(QString::number(j+1)); IsZdType=1; break; } } if(!IsZdType)QMessageBox::warning(NULL,"提示","defauletable.ini文件中表"+TableName+"的字段名"+DataList.at(0)+"类型不正确"); ZdLen.append(DataList.at(4)); if(DataList.count()>5){ ZdRes.append(DataList.at(5).toUpper()); } else ZdRes.append(DataList.at(3).toUpper()); } DefauleTable[DefTabNum++]=SetTableInf(TableName,TableAliasName,ZdName.count(),ZdName,HzName,ZdUnit,ZdType,ZdLen,ZdRes); ZdName.clear(); ZdLen.clear(); ZdType.clear(); HzName.clear(); HzName.clear(); ZdUnit.clear(); ZdRes.clear(); break; } } InFile.close(); } void DataHelper::DelDefauleTable() { if(!m_IsGc) { for(int i=0;i=FieldType[j])SameTypeNum++; } if(SameTypeNum==ZdNum)return i;//先找字段类型全部一致,匹配 }*/ return DefaultNo; } //剔除空行 bool DataHelper::IsNullLine(QByteArray line) { if(line=="")return 1; QStringList List=GetStringList(line); QString sss; bool IsNullLine=1; for(int kk=0;kkGetObjectByType(GetClassID_WellsFolder()); // QList childs; // pObj->GetChildren(childs); // int wellnum=childs.count(); // foreach(PaiObject *pChild,childs) // { // CObjWell *pWell=dynamic_cast(pChild); // if(pWell) WellNameList.append(pWell->GetName()); // } return WellNameList; } QStringList DataHelper::GetAllWellRoundName(QString WellName,QStringList& WellRoundFileNameList) { QStringList WellRoundNameList; WellRoundNameList.clear(); WellRoundFileNameList.clear(); // CObjWell * pWell = CDataImport::GetWellByName(WellName); // QList wellroundchildren; // int count=pWell->GetAllWellRound(wellroundchildren); // for(int i=0;i(wellroundchildren[i]); // QString strfileWellName=pWR->GetSlfFileName(); // WellRoundFileNameList.append(pWR->GetSlfFileName()); // QFileInfo fileInfo(pWR->GetSlfFileName()); // QString strWellName = fileInfo.completeBaseName(); // WellRoundNameList.append(strWellName); // } return WellRoundNameList; } int Function::get_exp(float *result) { *result=0.0; get_token(); if (!*token) { //serror(2); return 2+1; } int re=level1(result); if(re>0)return re; else return 0; } int Function::level1(float *result) { int slot,ttok_type; char temp_token[80]; int re; if (tok_type==VARIABLE) /* save old token */ { strcpy(temp_token,token); ttok_type=tok_type; slot=toupper(*token)-'A'; get_token(); if (*token !='=') { putback(); /* return current token */ /* restore old token */ strcpy(token,temp_token); tok_type=ttok_type; } else { get_token(); /* get next part of exp */ re=level2(result); if(re>0)return re; vars[slot]=*result; return 0; } } re=level2(result); if(re>0)return re; else return 0; } /* add or subtract two terms */ int Function::level2(float *result) { register char op; float hold; int re=level3(result); if(re>0)return re; while ((op=*token)=='+' || op=='-') { get_token(); re=level3(&hold); if(re>0)return re; arith(op,result,&hold); } return 0; } /* multiply or divide two factors */ int Function::level3(float *result) { register char op; float hold; int re=level4(result); if(re>0)return re; while ((op=*token)=='*' || op=='/' || op=='%') { get_token(); re=level4(&hold); if(re>0)return re; arith(op,result,&hold); } return 0; } /* process integer exponet */ int Function::level4(float *result) { register char op; float hold; int re=level5(result); if(re>0)return re; while ((op=*token)=='!' || op=='^') { get_token(); re=level4(&hold); if(re>0)return re; arith(op,result,&hold); } return 0; } /* unary + or - */ int Function::level5(float *result) { register char op; op=0; if ((tok_type==DELIMITER) && *token=='+' || *token=='-') { op=*token; get_token(); } int re=level6(result); if(re>0)return re; if (op) unary(op,result); return 0; } /* process parenthesized expression */ int Function::level6(float *result) {int re; if ((*token=='(') && (tok_type==DELIMITER)) { get_token(); re=level1(result); if(re>0)return re; if (*token !=')') { return 1+1; //serror(1); } get_token(); } else re=primitive(result); return re; } /* find value of number or variable */ int Function::primitive(float *result) { int re; switch (tok_type) { case VARIABLE: *result=find_var(token,&re); if(re>0)return re; get_token(); return 0; case MNUMBER: *result=atof(token); get_token(); return 0; default: //serror(0); return 1; } } /* perform the specified arithmetic */ void Function::arith(char o,float *r,float *h) { register int t,ex; switch (o) { case '-': *r=*r-*h; break; case '+': *r=*r+*h; break; case '*': *r=(*r) * (*h); break; case '/': if(*h==0) *r=0; else *r=(*r)/(*h); break; case '%': if(*h==0) *r=0; else { t=(*r)/(*h); *r=*r-t*(*h); } break; case '^': ex=*r; if (*h==0) { *r=1; break; } //for (t=*h-1;t>0;--t) *r=(*r) *ex; *r=pow((*r),(*h)); break; case '!': if (*r==10.) *r=log10(*h); else *r=log(*h); /* if (*h==10.) *r=log10(*r); else *r=log(*r); */ break; } } void Function::unary(char o,float *r) { if (o=='-') *r=-(*r); } /* return a token to its resting place */ void Function::putback() { char *t; t=token; for (;*t;t++) prog--; } /* find the value of a variable */ float Function::find_var(char *s,int *ret) { *ret=0; if (!isalpha(*s)) { //serror(1); *ret=2; return 0.; } float a; // return d_pDoc->INP[0].yy[toupper(*token)-'A']; return val[toupper(*token)-'A']; } /* display an error message */ void Function::serror(int error) { const static char *e[]={ "syntax error.", "unbalanced parentheses", "no expression present" }; AfxMessageBox(e[error]); } /* get a token */ void Function::get_token() { register char *temp; tok_type=0; temp=token; while (iswhite(*prog)) ++prog; /* skip over white space */ char strTmp[11] = "+-*/%!^=()"; if (is_in(*prog,strTmp)) { tok_type=DELIMITER; *temp++=*prog++; /* advance to next position */ } else if (isalpha(*prog)) { while (!isdelim(*prog)) { *temp++=*prog++; } tok_type=VARIABLE; } else if (isdigit(*prog)) { while (!isdelim(*prog)) { *temp++=*prog++; } tok_type=MNUMBER; } *temp='\0'; } int Function::iswhite(char c) { /* look for space and tabs */ if (c==' ' || c==9) return 1; return 0; } int Function::isdelim(char c) { char strTmp[11] = "+-*/%!^=()"; if (is_in(c,strTmp) || c==9 || c=='\r' || c==0) return 1; return 0; } int Function::is_in(char ch,char *s) { while (*s) if (*s++==ch) return 1; return 0; } int Function::GetExpress(QString csExpress) { int len,dPos[MaxArg],dCurvePos[MaxArg],dCurveNum,dOutPos; int i,j,flag,num,noi; int x1,y1,y2; QString csMessage,cs; char name[curve_name_len+1]; int iProgramOutCurvePos; Slf_OBJECT_ENTRY entryy; Slf_CHANNEL channel; // notice : // 进行曲线计算时,作为变量的曲线采样间距应一致 //A-Z 26 user's variable for (i=0; i=0.0) xstep=eps; else xstep=-eps; } return(xstep); } //--------------------------------------------------------------------- // Input: (x1,y1),(x2,y2),...,(xk,yk),(xk+1,yk+1),...,(xn,yn), // Region: {x[k],x[k+1]} // Function: Sk(x)=a[k]+b[k]*(x-x[k]) // Output: a[k],b[k] //--------------------------------------------------------------------- void Resample::Linear(float *x,float *y,int n,float *a,float *b) { for(int i=0;iaDep[anp-1]){ id=anp-1; } else { id=0; for(int i=0;ix&&j>left ) j--; if(i<=j) { y=datx[i]; datx[i]=datx[j]; datx[j]=y; memmove(va,&mr[i*Col],Col*sizeof(float)); memmove(&mr[i*Col],&mr[j*Col],Col*sizeof(float)); memmove(&mr[j*Col],va,Col*sizeof(float)); i++;j--; } } while(i<=j); if(leftx&&j>left ) j--; if(i<=j) { y=datx[i]; datx[i]=datx[j]; datx[j]=y; memmove(va,&mr[i*Col],Col*sizeof(short)); memmove(&mr[i*Col],&mr[j*Col],Col*sizeof(short)); memmove(&mr[j*Col],va,Col*sizeof(short)); i++;j--; } } while(i<=j); if(left