685 lines
19 KiB
C++
685 lines
19 KiB
C++
|
|
#include <QDateTime>
|
|||
|
|
#include <QTime>
|
|||
|
|
#include <QTextStream>
|
|||
|
|
#include "basefun.h"
|
|||
|
|
QString cfg;
|
|||
|
|
QList<double>dates;
|
|||
|
|
QList<double>depths;
|
|||
|
|
QList<QString>datest;
|
|||
|
|
QList<QString>deptht;
|
|||
|
|
double err=60;//2019.9.9 王卫让加
|
|||
|
|
double ddep=0;
|
|||
|
|
QStringList CurveNames;
|
|||
|
|
qint64 DataLineNum;//数据行数
|
|||
|
|
int HeadLineNum;//文件头行数
|
|||
|
|
QMap<QString,vector<float> > curvedata;//curvedata--存放读入的曲线数据,QMap原型为class QMap <K,T>,其中K表示键,T表示值,K和T属于映射关系.
|
|||
|
|
vector<float> md;//存放深度
|
|||
|
|
|
|||
|
|
struct SCANINF
|
|||
|
|
{
|
|||
|
|
float stdep,endep,rlev;
|
|||
|
|
short int dCurveNum;
|
|||
|
|
int DataPoint[500],HaveDepth;
|
|||
|
|
int LineDataPoint;
|
|||
|
|
qint64 DataBeginPos;
|
|||
|
|
char TexTypename[128];
|
|||
|
|
//for las
|
|||
|
|
CString DepthUnit;
|
|||
|
|
//for las3.0SBT
|
|||
|
|
float WaveStartTime[500];
|
|||
|
|
float WaveTimeRlev[500];
|
|||
|
|
}ScanInf;
|
|||
|
|
QStringList GetStringList(QString line,BOOL IsSpa=1,BOOL IsTab=1,BOOL IsCom=1,BOOL IsSem=1,BOOL DelDubSpa=1)
|
|||
|
|
{
|
|||
|
|
if(!IsCom)line.replace(",","");//如果逗号不是分隔符,清除逗号
|
|||
|
|
if(!IsSpa)line.replace(" ","");
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//连续空格视为单个处理
|
|||
|
|
if(DelDubSpa)while(line.indexOf(" ")>=0)line.replace(" "," ");
|
|||
|
|
line=line.simplified();line.replace(" ",",");
|
|||
|
|
}
|
|||
|
|
if(!IsTab)line.replace(" ","");//tab
|
|||
|
|
else line.replace(" ",",");
|
|||
|
|
if(!IsSem)line.replace(";","");
|
|||
|
|
else line.replace(";",",");
|
|||
|
|
QStringList List=line.split(",");
|
|||
|
|
return List;
|
|||
|
|
}
|
|||
|
|
int bSearch(FILE *fp,double*darray, int n, double data,double err)//
|
|||
|
|
{
|
|||
|
|
int low, mid, high;
|
|||
|
|
if(darray == NULL) return -1;//
|
|||
|
|
low = 0;
|
|||
|
|
high = n - 1;
|
|||
|
|
while(low <= high) {
|
|||
|
|
mid = (low + high) / 2;
|
|||
|
|
if(fabs(data-darray[mid])<err) {
|
|||
|
|
if(fp&&mid+1<n) fprintf(fp,"id=%d %lf %lf %lf %s %s\n",mid,data,darray[mid],darray[mid+1],datest[mid].toStdString().c_str(),deptht[mid].toStdString().c_str());
|
|||
|
|
return mid;
|
|||
|
|
}
|
|||
|
|
if(mid+1<n&&data>darray[mid]&&data<darray[mid+1]) {
|
|||
|
|
if(fp) fprintf(fp,"id=%d %lf %lf %lf %s %s\n",mid,data,darray[mid],darray[mid+1],datest[mid].toStdString().c_str(),deptht[mid].toStdString().c_str());
|
|||
|
|
return mid; //
|
|||
|
|
}
|
|||
|
|
else if(data < darray[mid]) high = mid - 1;
|
|||
|
|
else low = mid + 1;
|
|||
|
|
}
|
|||
|
|
return -1;//
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
double ComputeDate(QStringList str)
|
|||
|
|
{
|
|||
|
|
double depth=0;
|
|||
|
|
float a=0;
|
|||
|
|
float b[7]={977616000,2678400,86400,3600,60,1,0};
|
|||
|
|
QStringList ss,ss1;
|
|||
|
|
int aa=0;
|
|||
|
|
int bb=0;
|
|||
|
|
for(int i=0;i<str.size();i++) {
|
|||
|
|
ss1=str[i].split("/");
|
|||
|
|
if(ss1.size()<2) {
|
|||
|
|
ss1=str[i].split(":");
|
|||
|
|
aa++;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
bb=ss1.size();
|
|||
|
|
}
|
|||
|
|
ss.append(ss1);
|
|||
|
|
}
|
|||
|
|
for(int k=3-bb;k<ss.size();k++) {
|
|||
|
|
a=ss[k].toFloat();
|
|||
|
|
depth+=a*b[k];
|
|||
|
|
}
|
|||
|
|
return depth;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int GetDepthS(char *FileName,QString cfg)
|
|||
|
|
{
|
|||
|
|
dates.clear();
|
|||
|
|
depths.clear();
|
|||
|
|
datest.clear();
|
|||
|
|
deptht.clear();
|
|||
|
|
QString dcfg=FileName;
|
|||
|
|
int ic=dcfg.lastIndexOf("\\");
|
|||
|
|
int ib=dcfg.lastIndexOf("/");
|
|||
|
|
if(ib>ic) ic=ib;
|
|||
|
|
cfg=cfg.remove("\n");
|
|||
|
|
dcfg=dcfg.left(ic+1)+cfg;
|
|||
|
|
char fname[200];
|
|||
|
|
strcpy(fname,dcfg.toStdString().c_str());
|
|||
|
|
FILE *fp=fopen(fname,"rt");
|
|||
|
|
if(!fp)
|
|||
|
|
{
|
|||
|
|
CString sss;
|
|||
|
|
sss.Format("打开时深转换文件%s失败,请检查该文件是否存在\r\n否则将无法进行转换",fname);AfxMessageBox(sss);return 0;
|
|||
|
|
}
|
|||
|
|
char buf[1000];
|
|||
|
|
buf[0]=0;
|
|||
|
|
fgets(buf,1000,fp);
|
|||
|
|
QString ss;
|
|||
|
|
QStringList ss1,ss2;
|
|||
|
|
while(!feof(fp))
|
|||
|
|
{
|
|||
|
|
if(!fgets(buf,1000,fp)) break;
|
|||
|
|
ss=buf;
|
|||
|
|
if(ss.indexOf("\t")>-1&&ss.indexOf(" ")>-1)
|
|||
|
|
{
|
|||
|
|
while(ss.indexOf(" ")>-1) ss.replace(" "," ");
|
|||
|
|
ss.replace(" ","\t");
|
|||
|
|
}
|
|||
|
|
ss1=ss.split("\t");
|
|||
|
|
if(ss1.size()<2) ss1=ss.split(",");
|
|||
|
|
if(ss1.size()<2) ss1=ss.split(" ");
|
|||
|
|
if(ss1.size()<2) continue;
|
|||
|
|
ss2.clear();
|
|||
|
|
ss2.append(ss1[0]);
|
|||
|
|
ss2.append(ss1[1]);
|
|||
|
|
dates.append(ComputeDate(ss2));
|
|||
|
|
depths.append(ss1[2].toDouble());
|
|||
|
|
datest.append(ss1[0]);
|
|||
|
|
deptht.append(ss1[1]);
|
|||
|
|
}
|
|||
|
|
fclose(fp);
|
|||
|
|
return dates.size();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//读取并检查数据行是否丢失数据列,或者个别行少数据(数据之间无间隔时会被当做缺失数据)
|
|||
|
|
qint64 ReadAndCheckData(char *FileName,int Num)
|
|||
|
|
{
|
|||
|
|
char showName[80];
|
|||
|
|
sprintf(showName,"读%s数据",ScanInf.TexTypename);
|
|||
|
|
DepthProgress MyDepthProgress;
|
|||
|
|
MyDepthProgress.CreatProgress(0,100,showName);//"解编SLFAscii数据");
|
|||
|
|
MyDepthProgress.SetDepth(0);
|
|||
|
|
QFile InFile(FileName);
|
|||
|
|
if( !InFile.open(QIODevice::ReadOnly ) )return 0;
|
|||
|
|
QTextStream textstream( &InFile );
|
|||
|
|
for(int i=0;i<HeadLineNum;i++)QString lline=textstream.readLine();//跳过文件头
|
|||
|
|
#pragma region 判断是否为Forward转出的Las(深度单独一行,数据有换行)
|
|||
|
|
BOOL IsForwardLas=0;
|
|||
|
|
//int pos=textstream.pos();//当textstream读到汉字时,pos函数停止工作
|
|||
|
|
float dep[10];
|
|||
|
|
int Row=0,DataRow;//DataRow 每个深度点数据行数
|
|||
|
|
while(!textstream.atEnd())
|
|||
|
|
{
|
|||
|
|
if(Row>=10)break;
|
|||
|
|
QString line=textstream.readLine();
|
|||
|
|
line=line.simplified();
|
|||
|
|
if(line=="")continue;
|
|||
|
|
//QStringList StrList=line.split(" ");
|
|||
|
|
QStringList StrList=GetStringList(line);//,IsSpa,IsTab,IsCom,IsSem,DelDubSpa);
|
|||
|
|
if(StrList.size()==0)continue;
|
|||
|
|
if(StrList.size()==1)
|
|||
|
|
{
|
|||
|
|
DataRow=0;
|
|||
|
|
int Col=1;
|
|||
|
|
if(!Row)IsForwardLas=1;
|
|||
|
|
dep[Row++]=StrList[0].toFloat();
|
|||
|
|
while(!textstream.atEnd())
|
|||
|
|
{
|
|||
|
|
line=textstream.readLine();
|
|||
|
|
line=line.simplified();if(line=="")continue;
|
|||
|
|
//StrList=line.split(" ");
|
|||
|
|
StrList=GetStringList(line);
|
|||
|
|
if(StrList.size()==0)continue;
|
|||
|
|
Col+=StrList.size();
|
|||
|
|
DataRow++;
|
|||
|
|
if(Col>=Num)break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(IsForwardLas)
|
|||
|
|
{
|
|||
|
|
for(int i=1;i<10;i++)
|
|||
|
|
{
|
|||
|
|
if(dep[i]<dep[i-1]){AfxMessageBox("该数据可能不是标准的Las数据,请检查后再解编");return 0;}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
textstream.seek(0);//(pos);
|
|||
|
|
for(int i=0;i<HeadLineNum;i++)QString lline=textstream.readLine();//跳过文件头
|
|||
|
|
#pragma endregion 判断是否为Forward转出的Las(深度单独一行,数据有换行)
|
|||
|
|
qint64 lineNum=0,lostNum=0,firstLostNum=-1,colNum;//总数据行数,丢失数据的行数,首个丢失数据的行号,数据列数
|
|||
|
|
QString firstLost;//第一个丢失数据行
|
|||
|
|
int NanDataNum=0,firstNanDataLine=-1;//无效数据个数,第一个无效数据所在的数据行
|
|||
|
|
QString firstNan;//第一个无效数据行
|
|||
|
|
float depth;float first1=0;
|
|||
|
|
QStringList ss;
|
|||
|
|
QString tempfi=FileName;
|
|||
|
|
QString wellname,path;
|
|||
|
|
GetWellNameAndPath(tempfi,wellname,path);
|
|||
|
|
QString temp=GetLogdataPath()+"temp";
|
|||
|
|
CreateDir((char *)temp.toStdString().c_str());
|
|||
|
|
tempfi=GetLogdataPath()+"temp\\"+wellname+".txt";
|
|||
|
|
FILE *fpt=fopen(tempfi.toStdString().c_str(),"wt");
|
|||
|
|
while(!textstream.atEnd())//for(int i=0;i<10;i++)
|
|||
|
|
{
|
|||
|
|
int pro=lineNum*100/DataLineNum;
|
|||
|
|
if(pro%2==0)if(!(MyDepthProgress.SetDepth(pro)))
|
|||
|
|
{
|
|||
|
|
InFile.close();
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
QString line=textstream.readLine();
|
|||
|
|
line=line.simplified();
|
|||
|
|
if(line=="")continue;
|
|||
|
|
//QStringList StrList=line.split(" ");
|
|||
|
|
QStringList StrList=GetStringList(line);
|
|||
|
|
if(StrList.size()==0)continue;
|
|||
|
|
|
|||
|
|
if(IsForwardLas)//Forward转出的Las(深度单独一行,数据有换行)
|
|||
|
|
{
|
|||
|
|
for(int i=0;i<DataRow;i++)
|
|||
|
|
{
|
|||
|
|
line=textstream.readLine();line=line.simplified();
|
|||
|
|
//QStringList StrList1=line.split(" ");
|
|||
|
|
QStringList StrList1=GetStringList(line);
|
|||
|
|
for(int i=0;i<StrList1.size();i++)StrList.append(StrList1[i]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(StrList.size()!=Num)//丢失数据
|
|||
|
|
{
|
|||
|
|
colNum=StrList.size();
|
|||
|
|
if(lostNum==0){
|
|||
|
|
firstLostNum=lineNum+1;
|
|||
|
|
firstLost=line;
|
|||
|
|
}
|
|||
|
|
lostNum++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(ScanInf.HaveDepth>2)
|
|||
|
|
{
|
|||
|
|
float depth=0;
|
|||
|
|
float a=0;
|
|||
|
|
float b[5]={86400,3600,60,1,0};
|
|||
|
|
for(int k=0;k<ScanInf.HaveDepth;k++) depth+=StrList[k].toFloat()*b[k];
|
|||
|
|
depth=depth/1000.0;
|
|||
|
|
if(!first1) {
|
|||
|
|
first1=depth;
|
|||
|
|
}
|
|||
|
|
depth=depth-first1+ScanInf.stdep;
|
|||
|
|
}
|
|||
|
|
else if(ScanInf.HaveDepth>1)
|
|||
|
|
{
|
|||
|
|
float d1=StrList[2].toFloat();
|
|||
|
|
if(StrList.size()>10)
|
|||
|
|
{
|
|||
|
|
if(d1<0.25)continue;
|
|||
|
|
}
|
|||
|
|
ss.clear();
|
|||
|
|
for(int k=0;k<ScanInf.HaveDepth;k++) ss.append(StrList[k]);
|
|||
|
|
|
|||
|
|
double depth1=ComputeDate(ss);
|
|||
|
|
//2019.9.9 王卫让加
|
|||
|
|
if(dates.size()) {
|
|||
|
|
int pos=bSearch(NULL/*fpw*/,(double *)&dates[0],dates.size(),depth1,err);//1.0);
|
|||
|
|
if(pos>-1) {
|
|||
|
|
depth=depths[pos];
|
|||
|
|
fprintf(fpt,"%g ",depth);
|
|||
|
|
for(int i=ScanInf.HaveDepth;i<StrList.size();i++) {
|
|||
|
|
float d1=StrList[i].toFloat();
|
|||
|
|
fprintf(fpt,"%10.3f ",d1);
|
|||
|
|
}
|
|||
|
|
fprintf(fpt,"\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if(ScanInf.HaveDepth)
|
|||
|
|
{
|
|||
|
|
depth=StrList[0].toFloat();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
depth=ScanInf.stdep+lineNum*ScanInf.rlev;
|
|||
|
|
}
|
|||
|
|
md.push_back(depth);
|
|||
|
|
int DataNum=ScanInf.HaveDepth;
|
|||
|
|
for(int k=0;k<ScanInf.dCurveNum;k++)
|
|||
|
|
{
|
|||
|
|
for(int j=0;j<ScanInf.DataPoint[k];j++)
|
|||
|
|
{
|
|||
|
|
float val=-9999.;
|
|||
|
|
if(DataNum+j<StrList.size())val=StrList[DataNum+j].toFloat();
|
|||
|
|
if(_isnan(val))
|
|||
|
|
{
|
|||
|
|
val=-9999.;
|
|||
|
|
NanDataNum++;
|
|||
|
|
if(firstNanDataLine<0){
|
|||
|
|
firstNanDataLine=lineNum;
|
|||
|
|
firstNan=line;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
curvedata.find(CurveNames[k]).value().push_back(val);
|
|||
|
|
}
|
|||
|
|
DataNum+=ScanInf.DataPoint[k];
|
|||
|
|
}
|
|||
|
|
lineNum++;
|
|||
|
|
}
|
|||
|
|
fclose(fpt);
|
|||
|
|
if(lineNum+HeadLineNum>DataLineNum)AfxMessageBox("可能会丢失数据");
|
|||
|
|
InFile.close();
|
|||
|
|
|
|||
|
|
if(lostNum==0&&NanDataNum==0)return lineNum;//没有丢失,也没有无效数据
|
|||
|
|
QString mes,mes1;
|
|||
|
|
if(NanDataNum)
|
|||
|
|
{
|
|||
|
|
mes1="文件中存在"+QString::number(NanDataNum)+"个无效数据\r\n第一个存在无效数据的行在第"+QString::number(firstNanDataLine);
|
|||
|
|
mes1+="个数据行,数据内容为:\r\n";
|
|||
|
|
mes1+=firstNan;
|
|||
|
|
if(!lostNum)mes1+="\r\n\r\n是否继续解编?\r\n是-用-9999.0替代无效数据,继续解编\r\n否-退出解编";
|
|||
|
|
else mes1+="\r\n\r\n\r\n";
|
|||
|
|
}
|
|||
|
|
if(lineNum==lostNum)//整列缺失
|
|||
|
|
{
|
|||
|
|
mes="丢失数据列,文件头中定义数据列为"+QString::number(Num)+",实际数据列为"+QString::number(colNum)+"\r\n";
|
|||
|
|
mes+="\r\n是否继续解编?\r\n是-用-9999.0替代丢失数据,继续解编\r\n否-退出解编";
|
|||
|
|
}
|
|||
|
|
else if(lostNum)
|
|||
|
|
{
|
|||
|
|
mes="共有"+QString::number(lostNum)+"行丢失数据列\r\n第一个丢失数据的行在第"+QString::number(firstLostNum);
|
|||
|
|
mes+="个数据行,数据内容为:\r\n";
|
|||
|
|
mes+=firstLost;
|
|||
|
|
mes+="\r\n\r\n是否继续解编?\r\n是-用-9999.0替代丢失数据,继续解编\r\n否-退出解编";
|
|||
|
|
}
|
|||
|
|
MyDepthProgress.DelProgress();
|
|||
|
|
int yes=QMessageBox::information(NULL,"数据信息不完整",mes1+mes,QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
|
|||
|
|
if(yes==QMessageBox::Yes)return lineNum;//存在丢失数据,用-9999.0替代丢失数据
|
|||
|
|
else return 0;//存在丢失数据,不解编
|
|||
|
|
}
|
|||
|
|
bool Tran(char *FileName,char *outfile,int *OutCurveNo,char **OutCurve,char **strChineseName,char **strUnit)
|
|||
|
|
{
|
|||
|
|
int image=0;
|
|||
|
|
md.clear();
|
|||
|
|
curvedata.clear();
|
|||
|
|
QTime StartTime=QTime::currentTime();
|
|||
|
|
//获取井坐标和输出深度信息
|
|||
|
|
float xCoord,yCoord,outsdep,outedep;
|
|||
|
|
char *p;
|
|||
|
|
p=outfile;
|
|||
|
|
int len=strlen(p)+1;
|
|||
|
|
p+=len;
|
|||
|
|
GetTranMes(p,&xCoord,&yCoord,&outsdep,&outedep);
|
|||
|
|
if(outsdep<=-99999.)outsdep=ScanInf.stdep;
|
|||
|
|
if(outedep<=-99999.)outedep=ScanInf.endep;
|
|||
|
|
if(outsdep>outedep)
|
|||
|
|
{
|
|||
|
|
float temp=outsdep;
|
|||
|
|
outsdep=outedep;
|
|||
|
|
outedep=temp;
|
|||
|
|
}
|
|||
|
|
char showName[80];
|
|||
|
|
//sprintf(showName,"解编%s数据",ScanInf.TexTypename);
|
|||
|
|
DepthProgress MyDepthProgress;
|
|||
|
|
MyDepthProgress.CreatProgress(0,100,"统计数据行数");//showName);//"解编SLFAscii数据");
|
|||
|
|
MyDepthProgress.SetDepth(20);
|
|||
|
|
#pragma region 统计数据行数
|
|||
|
|
FILE *fp;
|
|||
|
|
if((fp=fopen(FileName,"rb"))==NULL)return 0;
|
|||
|
|
DataLineNum=0;
|
|||
|
|
int LineLen=(ScanInf.LineDataPoint+1)*15;//预算行长
|
|||
|
|
if(ScanInf.LineDataPoint+1<100)LineLen*=2;//数据量小时适当开大点,保证LineLen>行长
|
|||
|
|
char *buf=new char[LineLen+1];
|
|||
|
|
while(!feof(fp)){
|
|||
|
|
fgets(buf,LineLen,fp);
|
|||
|
|
if(strstr(buf,"IMAGE=")) {
|
|||
|
|
QString str=strstr(buf,"IMAGE=")+6;
|
|||
|
|
image=str.toInt();
|
|||
|
|
}
|
|||
|
|
DataLineNum++;
|
|||
|
|
}
|
|||
|
|
fclose(fp);
|
|||
|
|
delete buf;
|
|||
|
|
#pragma endregion 统计数据行数
|
|||
|
|
CurveNames.clear();
|
|||
|
|
for(int i=0;i<ScanInf.dCurveNum;i++)
|
|||
|
|
{
|
|||
|
|
QString str = QString(QLatin1String(OutCurve[i]));
|
|||
|
|
CurveNames.append(str);
|
|||
|
|
}
|
|||
|
|
vector<float > temp;
|
|||
|
|
temp.reserve(DataLineNum);
|
|||
|
|
md.reserve(DataLineNum);
|
|||
|
|
for(int i=0;i<ScanInf.dCurveNum;i++)
|
|||
|
|
{
|
|||
|
|
//if(OutCurveNo[i]>-1)
|
|||
|
|
{
|
|||
|
|
if(ScanInf.DataPoint[i]==1)//is curve
|
|||
|
|
{
|
|||
|
|
curvedata.insert(CurveNames[i], temp);
|
|||
|
|
}
|
|||
|
|
else //is wave
|
|||
|
|
{
|
|||
|
|
vector<float > wtemp;
|
|||
|
|
wtemp.reserve(DataLineNum*ScanInf.DataPoint[i]);
|
|||
|
|
curvedata.insert(CurveNames[i], wtemp);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
qint64 line=ReadAndCheckData(FileName,ScanInf.HaveDepth+ScanInf.LineDataPoint);
|
|||
|
|
if(!line)return 0;//line=0-存在丢失数据,不解编,>0,数据行数(没有丢失,或者用-9999.0替代丢失数据)
|
|||
|
|
CMemRdWt m_SlfFile(outfile);
|
|||
|
|
if(m_SlfFile.mFile==NULL){return 0;}
|
|||
|
|
Slf_CURVE myCurve;
|
|||
|
|
Slf_WAVE myWave;
|
|||
|
|
if(xCoord!=-99999&&yCoord!=-99999)
|
|||
|
|
{
|
|||
|
|
int index=m_SlfFile.FindObjectIndex("井基本信息");
|
|||
|
|
int indexSTable=m_SlfFile.OpenSTATIC("井基本信息");
|
|||
|
|
m_SlfFile.WriteTable(indexSTable,1,&WellStaticInfo);//inf);
|
|||
|
|
m_SlfFile.CloseTable(indexSTable);
|
|||
|
|
int indexDTable=m_SlfFile.OpenDYNAMIC("测井信息");
|
|||
|
|
m_SlfFile.WriteTable(indexDTable,1,&WellDynamicInfo);//inf);
|
|||
|
|
m_SlfFile.CloseTable(indexDTable);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sprintf(showName,"产生曲线");
|
|||
|
|
MyDepthProgress.CreatProgress(0,ScanInf.dCurveNum,showName);
|
|||
|
|
for(int i=0;i<ScanInf.dCurveNum;i++)
|
|||
|
|
{
|
|||
|
|
//sprintf(showName,"产生第%d条曲线%s,共%d条",i+1,OutCurve[i],ScanInf.dCurveNum);
|
|||
|
|
//MyDepthProgress.SetShowName(showName);
|
|||
|
|
if(!(MyDepthProgress.SetDepth(i+1))) break;
|
|||
|
|
if(OutCurveNo[i]>-1)
|
|||
|
|
{
|
|||
|
|
if(ScanInf.DataPoint[i]==1)//is curve
|
|||
|
|
{
|
|||
|
|
OutCurveNo[i]=m_SlfFile.OpenCurve(OutCurve[i]);
|
|||
|
|
if(OutCurveNo[i]<0)
|
|||
|
|
{
|
|||
|
|
strcpy(myCurve.Name,OutCurve[i]);
|
|||
|
|
strcpy(myCurve.AliasName,strChineseName[i]);
|
|||
|
|
strcpy(myCurve.Unit,strUnit[i]);
|
|||
|
|
strcpy(myCurve.AliasUnit,strUnit[i]);
|
|||
|
|
myCurve.RepCode=4;
|
|||
|
|
myCurve.CodeLen=4;
|
|||
|
|
myCurve.MinValue=99999.0;
|
|||
|
|
myCurve.MaxValue=-99999.0;
|
|||
|
|
myCurve.StartDepth=outsdep;
|
|||
|
|
myCurve.EndDepth =outedep;
|
|||
|
|
myCurve.DepLevel =ScanInf.rlev;
|
|||
|
|
strcpy(myCurve.DepthUnit,"m");
|
|||
|
|
strcpy(myCurve.DepthHZUnit,"米");
|
|||
|
|
OutCurveNo[i]=m_SlfFile.OpenCurve((Slf_CURVE *)&myCurve);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else //is wave
|
|||
|
|
{
|
|||
|
|
OutCurveNo[i]=m_SlfFile.OpenWave(OutCurve[i]);
|
|||
|
|
if(OutCurveNo[i]<0)
|
|||
|
|
{
|
|||
|
|
strcpy(myWave.Name,OutCurve[i]);
|
|||
|
|
strcpy(myWave.AliasName,strChineseName[i]);
|
|||
|
|
strcpy(myWave.Unit,strUnit[i]);
|
|||
|
|
strcpy(myWave.AliasUnit,strUnit[i]);
|
|||
|
|
myWave.RepCode=4;
|
|||
|
|
myWave.CodeLen=4;
|
|||
|
|
myWave.ArrayNum=1;
|
|||
|
|
myWave.MinValue=99999.0;
|
|||
|
|
myWave.MaxValue=-99999.0;
|
|||
|
|
myWave.StartDepth=outsdep;
|
|||
|
|
myWave.EndDepth =outedep;
|
|||
|
|
myWave.DepLevel =ScanInf.rlev;
|
|||
|
|
if(ScanInf.DepthUnit=="M"){
|
|||
|
|
sprintf(myWave.DepthUnit,"M");
|
|||
|
|
sprintf(myWave.DepthHZUnit,"米");
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
sprintf(myWave.DepthUnit,"FT");
|
|||
|
|
sprintf(myWave.DepthHZUnit,"英尺");
|
|||
|
|
}
|
|||
|
|
//strcpy(myWave.DepthUnit,"m");
|
|||
|
|
|
|||
|
|
myWave.StartTime=ScanInf.WaveStartTime[i];//0;
|
|||
|
|
myWave.TimeLevel=ScanInf.WaveTimeRlev[i];//1;
|
|||
|
|
myWave.TimeSamples=image>0?image:ScanInf.DataPoint[i];
|
|||
|
|
strcpy(myWave.TimeUnit,"US");
|
|||
|
|
strcpy(myWave.TimeHZUnit,"微秒");
|
|||
|
|
strcpy(myWave.TimeName,"Time\0");
|
|||
|
|
strcpy(myWave.TimeHZName,"时间\0");
|
|||
|
|
OutCurveNo[i]=m_SlfFile.OpenWave((Slf_WAVE *)&myWave);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
sprintf(showName,"解编%s数据",ScanInf.TexTypename);
|
|||
|
|
MyDepthProgress.SetShowName(showName);
|
|||
|
|
// MyDepthProgress.SetDepth(0);
|
|||
|
|
//插值并输出曲线数据
|
|||
|
|
std::vector<float>curAry;
|
|||
|
|
int size=(outedep-outsdep)/ScanInf.rlev+0.5+1;
|
|||
|
|
int hh=CurveNames.count();
|
|||
|
|
for(int i=0;i<CurveNames.count();i++)
|
|||
|
|
{
|
|||
|
|
if(i>hh)
|
|||
|
|
{
|
|||
|
|
hh=0;
|
|||
|
|
}
|
|||
|
|
//sprintf(showName,"解编第%d条曲线%s,共%d条",i+1,OutCurve[i],ScanInf.dCurveNum);
|
|||
|
|
//MyDepthProgress.SetShowName(showName);
|
|||
|
|
if(!(MyDepthProgress.SetDepth(i+1))) break;
|
|||
|
|
if(OutCurveNo[i]<0)continue;
|
|||
|
|
std::vector<float> _AryCurve;
|
|||
|
|
_AryCurve=curvedata.find(CurveNames[i]).value();
|
|||
|
|
curAry.clear();
|
|||
|
|
//curAry=_AryCurve;//不插值
|
|||
|
|
float curdepth=outsdep,enddepth=outedep;
|
|||
|
|
curAry.reserve(size*ScanInf.DataPoint[i]);
|
|||
|
|
int index=0;
|
|||
|
|
int indf=0;
|
|||
|
|
int inde=0;
|
|||
|
|
float depthf=curdepth;
|
|||
|
|
float depthe=enddepth;
|
|||
|
|
DWORD point=0;
|
|||
|
|
while (curdepth<=enddepth)
|
|||
|
|
{
|
|||
|
|
if(index==md.size()-1)
|
|||
|
|
{
|
|||
|
|
while(curdepth<=enddepth)
|
|||
|
|
{
|
|||
|
|
float v=-9999.0;
|
|||
|
|
curAry.push_back(v);
|
|||
|
|
// curdepth+=rlev;浮点深度累加,有误差,改成double可消除误差,但仍然缺失最后一个数据点
|
|||
|
|
point++;
|
|||
|
|
curdepth=outsdep+point*ScanInf.rlev;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
float depth1=md[index];
|
|||
|
|
if(fabsf(curdepth-depth1)>=ScanInf.rlev) {
|
|||
|
|
index++;
|
|||
|
|
if (index>=md.size())
|
|||
|
|
break;
|
|||
|
|
if(md[index-1] < curdepth && md[index] > curdepth)//后步过界,回退
|
|||
|
|
index--;
|
|||
|
|
else if(curdepth<md[index-1]){
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
if (index>=md.size())
|
|||
|
|
break;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if(index+1>=md.size()) break;
|
|||
|
|
float depth2=md[index+1];
|
|||
|
|
float rate=0;
|
|||
|
|
if(depth2==depth1) {
|
|||
|
|
for(int n=0;n<ScanInf.DataPoint[i];n++)
|
|||
|
|
{
|
|||
|
|
float val0=_AryCurve[index*ScanInf.DataPoint[i]+n];
|
|||
|
|
curAry.push_back(val0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
rate=(curdepth-depth1)/(depth2-depth1);
|
|||
|
|
for(int n=0;n<ScanInf.DataPoint[i];n++)
|
|||
|
|
{
|
|||
|
|
float val0=_AryCurve[index*ScanInf.DataPoint[i]+n];
|
|||
|
|
float val1=_AryCurve[(index+1)*ScanInf.DataPoint[i]+n];
|
|||
|
|
if(val0==-9999||val1==-9999)
|
|||
|
|
{
|
|||
|
|
float v=-9999.0;
|
|||
|
|
curAry.push_back(v);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
float v=val0+rate*(val1-val0);
|
|||
|
|
curAry.push_back(v);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
if(curdepth>=depth1 &&curdepth<=depth2)
|
|||
|
|
{
|
|||
|
|
while(curdepth<=depth2)
|
|||
|
|
{
|
|||
|
|
float rate=(curdepth-depth1)/(depth2-depth1);
|
|||
|
|
if(index+1>=_AryCurve.size()/ScanInf.DataPoint[i])
|
|||
|
|
break;
|
|||
|
|
for(int n=0;n<ScanInf.DataPoint[i];n++)
|
|||
|
|
{
|
|||
|
|
float val0=_AryCurve[index*ScanInf.DataPoint[i]+n];
|
|||
|
|
float val1=_AryCurve[(index+1)*ScanInf.DataPoint[i]+n];
|
|||
|
|
if(val0==-9999||val1==-9999)
|
|||
|
|
{
|
|||
|
|
float v=-9999.0;
|
|||
|
|
curAry.push_back(v);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
float v=val0+rate*(val1-val0);
|
|||
|
|
curAry.push_back(v);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//curdepth+=rlev;
|
|||
|
|
}
|
|||
|
|
index++;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(curdepth>depth2)
|
|||
|
|
index++;
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
float v=-9999.0;
|
|||
|
|
for(int n=0;n<ScanInf.DataPoint[i];n++) {
|
|||
|
|
curAry.push_back(v);
|
|||
|
|
}
|
|||
|
|
//curdepth+=rlev;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
*/
|
|||
|
|
point++;
|
|||
|
|
curdepth=outsdep+point*ScanInf.rlev;
|
|||
|
|
while(curdepth>=depth2) {
|
|||
|
|
index++;
|
|||
|
|
if(index+1>=md.size()) break;
|
|||
|
|
depth2=md[index+1];
|
|||
|
|
}
|
|||
|
|
if(index>=md.size()) break;
|
|||
|
|
}
|
|||
|
|
if(ScanInf.DataPoint[i]==1)
|
|||
|
|
{
|
|||
|
|
m_SlfFile.WriteCurve(OutCurveNo[i],outsdep,size,(float *)&curAry[0]);
|
|||
|
|
m_SlfFile.CloseCurve(OutCurveNo[i]);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
std::vector<float>curAry1;
|
|||
|
|
std::vector<float>curAry2;
|
|||
|
|
if(image) {
|
|||
|
|
for(int j=0;j<size;j++){
|
|||
|
|
curAry1.resize(image);
|
|||
|
|
float dd=(float)image/ScanInf.DataPoint[i];
|
|||
|
|
Resamples(&curAry[ScanInf.DataPoint[i]*j],&curAry1[0],ScanInf.DataPoint[i],image);
|
|||
|
|
for(int k=0;k<image;k++) curAry2.push_back(curAry1[k]);
|
|||
|
|
}
|
|||
|
|
curAry=curAry2;
|
|||
|
|
}
|
|||
|
|
m_SlfFile.WriteWave(OutCurveNo[i],outsdep,size,(float *)&curAry[0]);
|
|||
|
|
m_SlfFile.CloseWave(OutCurveNo[i]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
dates.clear();
|
|||
|
|
depths.clear();
|
|||
|
|
datest.clear();
|
|||
|
|
deptht.clear();
|
|||
|
|
m_SlfFile.Close();
|
|||
|
|
md.clear();
|
|||
|
|
curvedata.clear();
|
|||
|
|
QTime EndTime=QTime::currentTime();
|
|||
|
|
int elapsed = StartTime.msecsTo(EndTime);
|
|||
|
|
int h=elapsed/1000/60/60;
|
|||
|
|
int m=(elapsed-(h*1000*60*60))/1000/60;
|
|||
|
|
int sec=(elapsed-(h*1000*60*60)-(m*1000*60))/1000;
|
|||
|
|
int msec=elapsed-(h*1000*60*60)-(m*1000*60)-sec*1000;
|
|||
|
|
QTime time(h,m,sec,msec);
|
|||
|
|
QString Stime=QString::fromLocal8Bit("开始时间:")+StartTime.toString("hh:mm:ss.zzz");
|
|||
|
|
Stime+=QString::fromLocal8Bit("\r\n结束时间:")+EndTime.toString("hh:mm:ss.zzz");
|
|||
|
|
Stime+=QString::fromLocal8Bit("\r\n耗时:")+time.toString("hh:mm:ss.zzz");
|
|||
|
|
Stime+=QString::fromLocal8Bit("\r\n共")+QString::number(elapsed)+QString::fromLocal8Bit("毫秒");
|
|||
|
|
//QMessageBox::about(NULL,QString::fromLocal8Bit("解编运行时间"),Stime);
|
|||
|
|
return TRUE;
|
|||
|
|
}
|