logplus/tran/LISConvertor/src/LisConvertor.cpp

1426 lines
36 KiB
C++
Raw Normal View History

#pragma warning( push ,0)
#include"LisConvertor.h"
#include <QFileDialog>
#include <QTextStream>
#include "CStringType.h"
#include "MemRdWt.h"/*..\..\Slfio\*/
#include "BaseFun.h"
// #include "WellBaseInfo.h"
#include "DepthProgress.h"
#include "sub.h"
#include "qdir.h"
#define IREEL 0x0084
#define ITAPE 0x0082 //130
#define IFILE 0x0080 //128
#define IFORM 0x0040 //64
#define IDATA 0x0000
#define IFAIL 0x0081 //129
#define ITRAIL 0x0083 //131
#define IRAIL 0x0085 //133
#define ISL 0x42FF //17151
#define IDEP1 0x4954 //18772
#define IDEP2 0x454D // 17741
//20201216 GZL add
#define EACHCALNUM 1
//132 Vol.(REEL)_HEADER information
//133 Vol.(REEL)_TRAIL information
//130 TAPE_HEADER information
//131 TAPE_TRAIL information
//128 FILE_HEADER information
//129 FILE_TRAIL information
//232 COMMENT record information
//34 INFORMATION record information
//64 FORMAT SPECIFICATION record information
//0 data
float rlev,dep,sdep,edep;
char curvnms[3000][5],units[3000][5],depunit[5],levunit[5];
int ircodes[3000],npoints[3000],nsamps[3000],ipost[3000],iexst[3000],ndim[3000];
int ncurvs,lframe,nframe,modep;
FILE *fp;
int Numlog;
int skip,TapeRlev;
int neofbyte,ngapbyte;
unsigned char buff[400000];
float value[100000];
WELL_DYNAMIC_INFO *mWellDynamicInfo;
#pragma warning( pop)
BEGIN_OSGGRAPHICS_NAMESPACE;
#define GetLisConvertorTypeID() "{75B4CBA4-AF9D-4FEF-AA81-49CE697E158C}"
Slf_FILE_MESSAGE FILE_MESSAGE={};
BEGIN_REGISTER_ID_DESCRIPTION()
ID_ITEM_DATA(GetLisConvertorTypeID(),"LisConvertor")
END_REGISTER_ID_DESCRIPTION();
int intMax(int *arr, int arrnum){
int maxTemp = 0;
for(int i; i < arrnum; i++)
if (maxTemp < arr[i])
maxTemp = arr[i];
return maxTemp;
}
template<typename T1, typename T2>
void removeRedunant(T1& r_v, const T2 Re_v)
{
if(Re_v == 0) return;
bool isNeg = (r_v < 0) ? true : false;
r_v = float(int(abs(r_v) * Re_v + 0.5)) / Re_v;
r_v = (isNeg) ? -r_v : r_v;
}
template<typename OT1, typename IT2>
bool cal_SaveNumInf(const OT1 outsdep,const OT1 outedep,const OT1 outrlev, OT1 eachStartDep,IT2& value2Index,IT2& realSaveNum,OT1& saveStartDep)
{
removeRedunant(eachStartDep, 1000);
if(eachStartDep >outsdep-outrlev && eachStartDep <outedep+outrlev) //处于输出范围内
{
const int temp_MaxSaveNum = abs((outedep - eachStartDep) / outrlev) + 1.5; //最大容纳点数
realSaveNum = (realSaveNum > temp_MaxSaveNum) ? temp_MaxSaveNum : realSaveNum; //本轮可容纳点数
value2Index = 0; //从起始位置即可
saveStartDep = eachStartDep;
return true;
}
else if(eachStartDep < outsdep) //处于输出范围前侧
{
value2Index = abs((outsdep - eachStartDep) / outrlev); //范围内位置
if(value2Index <= realSaveNum) //包含有效数据
{
realSaveNum = realSaveNum - value2Index;
saveStartDep = outsdep;
return true;
}
else //不包含有效数据
{
realSaveNum = 0;
saveStartDep = outsdep;
return false;
}
}
return false;
}
CLisConvertor::CLisConvertor()
{
m_thisModuleName="LisConvertor";
isSpLis = false;
m_CurveData.Curve_Num=0;
m_CurveData.Curve_Step=0.0;
m_CurveData.Curve_StartDepth=0.0;
m_CurveData.Curver_EndDepth=0.0;
m_CurveData.Curver_MaxDim=0;
InitFormatSuffixName();
}
CLisConvertor::~CLisConvertor()
{
}
QVector<QString> CLisConvertor::GetSupportFileExtensions()
{
return m_vFileFormatSuffixName;
}
void CLisConvertor::InitFormatSuffixName()
{
m_vFileFormatSuffixName.clear();
m_vFileFormatSuffixName.push_back("lis");
m_vFileFormatSuffixName.push_back("dat");
m_vFileFormatSuffixName.push_back("nti");
QVector<QString> suffixname=InterIConvertor::GetSupportFileExtensions();
m_vFileFormatSuffixName+=suffixname;
}
int CLisConvertor::ScanLogFile(char *FileName,char *Message,char **CurveName,char **CurveUnit)
{
isSpLis = false;
char szTemp[128];
strcpy(szTemp, "[LIS]");
int pos1=GetBeginPosit(FileName,szTemp);
mWellDynamicInfo=&WellDynamicInfo;
if((fp=fopen(FileName,"rb"))==NULL) {
QMessageBox::information(NULL,FileName,"Open Not File:",QMessageBox::Ok);
return 0;
}
char path[256];
//CString TempPath=GetBinDir(path);;
CString TempPath=GetLogdataPath();
TempPath=TempPath+"\\Temp";
QDir *temp=new QDir;
bool bWorking=temp->exists(TempPath.GetString());
if(!bWorking)
{
bWorking=temp->mkdir(TempPath.GetString());
CString aaa;
aaa.Format("创建临时文件路径%s失败",TempPath);
if(!bWorking)
{
AfxMessageBox(aaa);
fclose(fp);
return -1;
}
}
delete temp;
CString te="\\";
TempPath+=te;
char filename[128];
sprintf(filename,"%stemp",TempPath.GetString());
//FILE *out;
//out=fopen(filename,"w+t");
int maxrl=8196 ;
float abstrv=-999.25;
char mbuf[5000];
//float value[100000];
int len=maxrl,idrt,lrtype;
//whp add 2019.8.6 for:后缀为dat的数据很多首先根据LIS数据特征精确判断是否为LIS数据
QString ext;
ext=QString(QLatin1String(FileName));
ext=ext.toUpper();
if(ext.endsWith(".DAT"))
{
len=fread(buff,336,1,fp);
if(len<=0){
fclose(fp);
return -1;
}
int i1=-1,i2=-1,i3=-1;
for(int i=0;i<336;i++)
{
if(buff[i]=='\/')
{
i1=i;break;
}
}
if(i1<30){
fclose(fp);
return -1;
}
for(int i=0;i<336;i++)
{
if(buff[i]>=48&&buff[i]<=57)
{
i2=i;break;
}
}
if(i2<0){
fclose(fp);
return -1;
}
for(int i=i1-30;i<336;i++)
{
if(buff[i]==128)
{
i3=i;break;
}
}
if(i3<0){
fclose(fp);
return -1;
}
if(((buff[4] >= 65 && buff[4] <= 122) ||buff[4]==32) && ((buff[5] >= 65 && buff[5] <= 122)||buff[5]==32))
{
fclose(fp);
return -1;
}
fseek(fp,0L,0);
}
BOOL HaveFileTailRec=0;//有的文件没有文件尾记录
//add end
int istat=fread(buff,len,1,fp);
for(int i=0;i<maxrl-5;i++)
{
int lprl=buff[i]*256+buff[i+1];
int k=i+4;
lrcls(buff[k],&idrt,&lrtype);
if(lrtype==132||lrtype==130||lrtype==128)
{
if(lprl<=maxrl&&lprl>0)
{
//特殊lis检查
int lrtypeSp;
lrcls(buff[k+2],&idrt,&lrtypeSp);
if(lrtype==128 && lrtypeSp == 128){
i+=2;
ngapbyteSpFirst = i;
isSpLis = true;
}
ngapbyte=i;
neofbyte=ngapbyte;
goto L10;
}
}
}
L10:skip=0,TapeRlev=0;
if(neofbyte==22)//&&strstr(buff,"FORWARD TAPE IMAGE")) this is FORWARD TAPE IMAGE
{
TapeRlev=8;
skip=22-8;
ngapbyte=TapeRlev;
}
//for 进度条
fseek(fp,0,SEEK_END);
DWORD fl=ftell(fp);
DWORD FileLength=fl;
//MyDepthProgress.CreatProgress(0,fl/100000,"扫描LIS格式文件");
if(m_pDepthProgress) m_pDepthProgress->SetShowName("格式类型:LIS",0);
if(m_pDepthProgress) {
m_pDepthProgress->CreatProgress(0,100,"信息提取..",1);//m_pDepthProgress->CreatProgress(0,fl,"信息提取..",1);
m_pDepthProgress->SetDepth(0,1);
}
fseek(fp,skip,0);//跳过字节数如forward下载的lis文件就有22个字符的说明信息
int ntbyte=0;
int lrtype0=-99;
int nlr=0;
int nfile=0;
// read a logical record (many physical record).
int lbuff,istats,nbyte;
float rlevfc,depfc,rlevd,vsdep,vedep;
int ifged=0,ifgst=0,irec=0,nlrdat=0;
CString str;
strcpy(Message,"\r\n---------------------SCHLUMBERGER LIS 格式文件信息---------------------------\r\n");
ncurvs=0;
int rec=0;
while(1)
{
rec++;
int f=ftell(fp);
if(f<0) break;
rdbuf(fp,buff,&lbuff,&lrtype,&istats,maxrl,&nbyte,ngapbyte);
//20210115 GZL ADD
if(isSpLis)ngapbyte=8;
int percent=(float)f*100./(float)FileLength;
if(m_pDepthProgress)
{
if(!(m_pDepthProgress->SetDepth(percent,1))) {
fclose(fp);
return -1;//if(!(m_pDepthProgress->SetDepth(f,1))) return -1;
}
}
if(istats<=0)break;
if(lrtype!=lrtype0)
{
//str.Format("lbuff,lrtype,nrecs=%d,%d,%d\r\n",lbuff,lrtype,nlr);
//sprintf(Message,"%s%s",Message,str);
//AfxMessageBox(str);
str="";
}
lrtype0=lrtype;
// write vol.(reel)_header information.
if(lrtype==132)
{
str=reelhd((char *)buff);
}
// write vol.(reel)_trail information.
else if(lrtype==133)
{
strncpy(mbuf,(char *)&buff[2],lbuff-3+1);
mbuf[lbuff-3+1]=0;
str.Format("*** reel trail *** %s",mbuf);
// skip vol.(reel) trail bytes (2 eof)
len=neofbyte*2;
if(len>0)
{
istat=fread(buff,len,1,fp);
if(istat<=0) break;
}
ntbyte=ntbyte+neofbyte*2;
sprintf(mbuf,"ntbytes = %d\r\n two eof \r\n",ntbyte);
str+=CharToCstring(mbuf,strlen(mbuf));
}
// write tape_header information.
else if(lrtype==130)
{
str=tapehd((char *)buff);
// skip eof(file end) bytes(a eof).
len=neofbyte;
if(len>0) {
istat=fread(buff,len,1,fp);
if(istat<=0)break;
}
ntbyte=ntbyte+neofbyte;
str.Format(str.GetString(),"ntbytes = %d\r\n a eof \r\n",str,ntbyte);
}
// write tape_trail information.
else if(lrtype==131)
{
strncpy(mbuf,(char *)&buff[2],lbuff-3+1);
mbuf[lbuff-3+1]=0;
str.Format("*** tape trail *** %s\r\n",mbuf);
}
// write file_header information.
else if(lrtype==128)
{
nfile=nfile+1;
str.Format("\r\n *** file number:%d\r\n",nfile);
str+=CString("\r\n *** file header ***\r\n\r\n-----------------------------------\r\n")+filehd((char *)buff,&maxrl);
// str.Format("%s maxrl=%d\r\n",str,maxrl) ;
// AfxMessageBox(str);
}
// write file_trail information.
else if(lrtype==129)
{
HaveFileTailRec=1;
rlev=rlev*rlevfc;
rlevd=(vedep-vsdep)/float(ifged-ifgst);
if(fabs(rlev-rlevd)>0.0001&&fabs(rlev)<0.0001)
{
rlev=rlevd;
}
//20220815
if(rlev<0)
rlev=float(int((rlevd-0.000005)*100000))/100000;
else
{
float temp_rlev = float(int((rlevd+0.000005)*100000))/100000;
if(temp_rlev != float(int(rlevd*100000)/100000) && temp_rlev > rlev)
{
rlev = temp_rlev;
}
}
//3???modep=0时space没赋值rlev就不能满足条件if(fabs(rlev-rlevd)>0.0001&&fabs(rlev)<0.0001)所以得到的rlev值是不正确的
//whp add
if(modep==0&&rlev<-9999)
{
rlev=rlevd;
float del=fabs(fabs(rlev)-0.1);
if(del<0.001)rlev=0.1;
}//add end
sdep=vsdep;
edep=vedep;
// str.Format(("irec,nlrdat=%d %d\r\nvsdep,vedep=%f% f\r\nifgst,ifged=%d %d\r\nsdep,edep,rlev=%f %f %f\r\n"),irec,nlrdat,vsdep,vedep,ifgst,ifged,sdep,edep,rlev);
strncpy(mbuf,(char *)&buff[2],lbuff-3+1);
str+=CString("\r\n\r\n*** file trail ***\r\n\r\n----------------------------------\r\n");
str+=filehd((char *)buff,&maxrl);
// skip eof (file end) bytes(a eof).
len=neofbyte;
if(len>0)
{
istat=fread(buff,len,1,fp);
if(istat<=0)break;
}
ntbyte=ntbyte+neofbyte;
str+=CString("\r\na eof !\r\na eof !\r\n");
}
// write comment record information.
else if(lrtype==232)
{
//strncpy(mbuf,(char *)&buff[2],lbuff-3+1);
//str.Format("*** comment: ***%s",mbuf);
}
// write information record information.
else if(lrtype==34)
{
//iswinft=1;
// infrec(nu,buff,lbuff,iswinft);
str=infrec((char *)buff,lbuff,0);
str="";
}
// write format specification record information.
else if(lrtype==64)
{
str=formsp((char*)buff,lbuff,1);
depfc=unitfactor(depunit,4);
rlevfc=unitfactor(levunit,4);
}
else if(lrtype==0)
{
nlrdat=nlrdat+1;
int nfrm=(lbuff-2)/lframe;
if(nfrm!=nframe)
{
nframe=nfrm;
CString ss;
ss.Format(("nrecs,lbuff,nframe=%d %d %d\r\n"),lrtype,lbuff-2,nframe);
str+=ss;
}
else str="";
float dep0;//whp add
for(int i=0;i<nframe;i++)
{
if(modep==1) //无深度曲线
{
int ips=3;
int nsamp=1;
int icode=ircodes[ncurvs];
convrt(&value[0],(unsigned char *)buff,lbuff,ips,icode,nsamp);
dep=value[0]*depfc+rlev*(i)*rlevfc;
}
else //有深度曲线
{
int ips=2+ipost[ncurvs]+i*lframe;
int nsamp=1;
int icode=ircodes[ncurvs] ;
convrt(&value[0],(unsigned char *)buff,lbuff,ips,icode,nsamp);
dep=value[0]*depfc ;
}
irec=irec+1;
if(abs(dep+abstrv)>0.01&&ifgst==0&&fabs(dep+9999.)>0.01)
{
ifgst=irec;
vsdep=dep;
if(irec!=1)
{
CString ss;
ss.Format("irec=%d,warning! depth track value error.",irec);
AfxMessageBox(ss);
}
}
if(abs(dep+abstrv)>0.01&&abs(dep+9999.)>0.01)
{
ifged=irec ;
vedep=dep;
}
}
}
sprintf(Message,"%s%s",Message,str.GetString());
}
Numlog=ncurvs;//+1;
sprintf(&Message[strlen(Message)],"\r\n曲线条数:%d\r\n\r\n起始深度:%g 终止深度:%g \r\n采样间隔:%g\r\n\r\n",Numlog,sdep,edep,rlev);
fclose(fp);
//whp add 2019.8.8 for 有的文件没有文件尾记录
if(HaveFileTailRec==0)//如果没有文件尾记录
{
AfxMessageBox("该文件没有文件尾记录");
rlev=rlev*rlevfc;
rlevd=(vedep-vsdep)/float(ifged-ifgst);
double gg=fabs(rlev-rlevd);
if(fabs(rlev-rlevd)>0.0000000001&&fabs(rlev)<0.1)
{
rlev=rlevd;
}
//20210115 GZL ADD
if(1)
if(rlev<0)
rlev=float(int((rlevd-0.000005)*100000))/100000;
else
rlev=float(int((rlevd+0.000005)*100000))/100000;
//modep=0时space没赋值rlev就不能满足条件if(fabs(rlev-rlevd)>0.0001&&fabs(rlev)<0.0001)所以得到的rlev值是不正确的
if(modep==0&&rlev<-9999)
{
rlev=rlevd;
float del=fabs(fabs(rlev)-0.1);
if(del<0.001)rlev=0.1;
}
sdep=vsdep;
edep=vedep;
if(sdep>edep)
{
float temp=sdep;
sdep=edep;
edep=temp;
}
str.Format(("\r\n\r\n曲线条数=%d\r\n起始深度:%g 终止深度:%g \r\n采样间隔:%g\r\n\r\n"),ncurvs,sdep,edep,rlev);
str+="\r\na eof !\r\na eof !\r\n";
sprintf(Message,"%s%s",Message,str.GetString());
for(int i=0;i<ncurvs;i++)
{
strcpy(CurveName[Numlog+i],curvnms[i]);
strcpy(CurveUnit[Numlog+i],units[i]);
}
}
//add end
//调用该函数,向解编信息中压入深度信息
for(int i=0;i<Numlog;i++)
{
strcpy(CurveName[i],curvnms[i]);
strcpy(CurveUnit[i],units[i]);
}
if(sdep>edep)
{
float temp=sdep;
sdep=edep;
edep=temp;
rlev=-1*fabs(rlev);
}
PutScanDepthMes(Message,sdep,edep);
//fclose(out);
return Numlog;
}
bool CLisConvertor::Transfer(char *FileName,char *outfile,int *OutCurveNo,char **OutCurve,char **strChineseName,char **strUnit,int dCurveNum)
{
if(HaveSameCurve(Numlog,OutCurveNo,OutCurve))
return 0;
removeRedunant(rlev, int(10000));
float xCoord = 0, yCoord = 0, outsdep = -99999, outedep = -99999, outrlev = rlev;
char *p;
p = outfile;
int len = strlen(p) + 1;
p += len;
GetTranMes(p, &xCoord, &yCoord, &outsdep, &outedep);
outsdep = (outsdep == -99999.) ? sdep : outsdep;
outedep = (outedep == -99999.) ? edep : outedep;
if(outsdep > outedep)
{
swap(outsdep, outedep);
}
CMemRdWt m_SlfFile(outfile);
if(m_SlfFile.mFile == NULL) return 0;
Slf_CURVE myCurve;
Slf_WAVE myWave;
Slf_CHANNEL m_Channel;
Slf_WAVE **tslfwave = NULL;
if(xCoord != -99999 && yCoord != -99999)
{
char buf[256];
QString strWellInfo= "井基本信息";
strcpy(buf, strWellInfo.toLocal8Bit().data());
int index = m_SlfFile.FindObjectIndex(buf);
int indexSTable = m_SlfFile.OpenSTATIC(buf);
m_SlfFile.WriteTable(indexSTable, 1, &WellStaticInfo);
m_SlfFile.CloseTable(indexSTable);
int indexDTable=m_SlfFile.OpenDYNAMIC(buf);
m_SlfFile.WriteTable(indexDTable, 1, &WellDynamicInfo);
m_SlfFile.CloseTable(indexDTable);
}
int pointnum = 0;
for(int i = 0; i < ncurvs; i++)
{
if(OutCurveNo[i] > -1)
{
#pragma region 获取name
char name[20];
strncpy(name, OutCurve[i], 16);
for(int ij = 1; ij < 16; ij++)
{
if(name[ij] == ' ')
name[ij] = '\0';
else
name[ij] = toupper(name[ij]);
}
#pragma endregion
#pragma region 初始化曲线进slf
if(ndim[i] <= 1)
{
int index = m_SlfFile.OpenCurve(name);
if(index < 0)
{
strcpy(myCurve.Name,name);
strcpy(myCurve.AliasName,strChineseName[i]);
strcpy(myCurve.Unit,strUnit[i]);
strcpy(myCurve.AliasUnit,strUnit[i]);
if(ircodes[i]==79) myCurve.RepCode=REPR_SHORT;
else if(ircodes[i]==73) myCurve.RepCode=REPR_INT;
else myCurve.RepCode=REPR_FLOAT;
myCurve.CodeLen=RepSize[myCurve.RepCode];
myCurve.MinValue=99999.0;
myCurve.MaxValue=-99999.0;
myCurve.DefVal=-9999;
myCurve.StartDepth=outsdep;
myCurve.EndDepth =outedep;
myCurve.DepLevel =fabs(rlev)/npoints[i];
strcpy(myCurve.DepthUnit,"m");
OutCurveNo[i] = m_SlfFile.OpenCurve((Slf_CURVE *)&myCurve);
}
else
OutCurveNo[i] = m_SlfFile.OpenCurve(name);
//pointnum 所需数据点个数
pointnum = (myCurve.EndDepth - myCurve.StartDepth) / myCurve.DepLevel + 1.5;
//仅为该曲线开空间 --> curvebuf
char *curvebuf = new char[myCurve.CodeLen * pointnum + 1];
memset(curvebuf, 0, myCurve.CodeLen * pointnum);
//先写假cur值0
if(OutCurveNo[i] > -1)
m_SlfFile.WriteCurve(OutCurveNo[i], outsdep, pointnum, (void *)curvebuf);
delete curvebuf;
}
else //ndim > 1
{
if(!tslfwave) {
tslfwave=new Slf_WAVE*[ncurvs];
for(int k=0;k<ncurvs;k++) tslfwave[k]=NULL;
}
tslfwave[i]=new Slf_WAVE;
memset(tslfwave[i],0,sizeof(Slf_WAVE));
int index = m_SlfFile.OpenWave(name);
if(index < 0)
{
strcpy(myWave.Name,name);
strcpy(myWave.AliasName,strChineseName[i]);
strcpy(myWave.Unit,strUnit[i]);
strcpy(myWave.AliasUnit,strUnit[i]);
myWave.CodeLen=lbytes(ircodes[i]);
if(ircodes[i]==79) myWave.RepCode=REPR_SHORT;
else if(ircodes[i]==73) myWave.RepCode=REPR_INT;
else myWave.RepCode=REPR_FLOAT;
myWave.MinValue=99999.0;
myWave.MaxValue=-99999.0;
myWave.DefVal=-9999;
myWave.StartDepth= outsdep;
myWave.EndDepth = outedep;
myWave.DepLevel = fabs(rlev) / (npoints[i] / ndim[i]);
strcpy(myWave.DepthUnit,"m");
myWave.StartTime=0;//从哪儿得到该信息?
myWave.TimeLevel=2;
myWave.TimeSamples=ndim[i];
strcpy(myWave.TimeUnit,"us");
OutCurveNo[i] = m_SlfFile.OpenWave((Slf_WAVE *)&myWave);
pointnum = (myWave.EndDepth - myWave.StartDepth) / myWave.DepLevel + 1.5;
memmove(tslfwave[i],&myWave,sizeof(Slf_WAVE));
char *curvebuf = new char[myWave.CodeLen * myWave.TimeSamples * pointnum + 1];
memset(curvebuf, 0, myWave.CodeLen * myWave.TimeSamples * pointnum);
if(OutCurveNo[i] > -1)
m_SlfFile.WriteWave(OutCurveNo[i], outsdep, pointnum, (void *)curvebuf);
delete curvebuf;
}
else
OutCurveNo[i] = m_SlfFile.OpenWave(name);
}
#pragma endregion
}
}
//char cchans[10000],tcurvnm[48];
char mbuf[5000];
// idir=0 orgin depth direction(decoded data depth)
// =1 up[small] - bottom[large] [depth]
//float sdepob[40],edepob[40],rlevob[40],nchans[40],lchanv[1000];
//int norg[1000],ncopy[1000],
int nele[6], lrecf[40], npfrmob[40];
float rlevfc,depfc,rlevd,vsdep,vedep;
//unsigned char buff[40000];
//float value[100000];
int idrt,lrtype,lbuff,istats,nbyte;;
int istat;
int idir=1;
int maxrl=1024;
float abstrv=-999.25;
int maxcurv=100;
// format spcification number
int nfmsp=0 ,nfrmob;
if((fp=fopen(FileName,"rb")) == NULL) {
QMessageBox::information(NULL,FileName,"Open Not File:",QMessageBox::Ok);
return 0;
}
char path[256];
//CString TempPath=GetBinDir(path);
CString TempPath = GetLogdataPath();
TempPath = TempPath+"Temp";
QDir *temp=new QDir;
bool bWorking=temp->exists(TempPath.GetString());
if(!bWorking)
{
bWorking=temp->mkdir(TempPath.GetString());
CString aaa;
aaa.Format("创建临时文件路径%s失败",TempPath);
if(!bWorking)
{
AfxMessageBox(aaa);
return -1;
}
}
delete temp;
TempPath+=CString("\\");
char filename[128];
sprintf(filename,"%slistraninfo.txt",TempPath.GetString());
// FILE *out;
// out=fopen(filename,"w+t");
int ntbyte=0;
int lrtype0=-99;
int nlr=0;
int nlrdat=0;
int irec=0;
int ifgst=0;
int ifged=0;
int ipfile=0;
int iprdfl=1;
fseek(fp, skip, 0);//跳过字节数如forward下载的lis文件就有22个字符的说明信息
// CString str;
//当前仅适用于处理常规曲线
float **value2 = new float*[ncurvs];
for(int value2ColNum = 0; value2ColNum < ncurvs; value2ColNum++){
if(OutCurveNo[value2ColNum]>-1)
{
value2[value2ColNum] = new float [EACHCALNUM * npoints[value2ColNum] * 2+1000];
memset(value2[value2ColNum],0,EACHCALNUM * npoints[value2ColNum] * 2*sizeof(float));
}
}
char **value2forWave = new char*[ncurvs];
for(int value2ColNum = 0; value2ColNum < ncurvs; value2ColNum++){
if(ndim[value2ColNum] > 1&&OutCurveNo[value2ColNum]>-1)
{
value2forWave[value2ColNum] = new char [tslfwave[value2ColNum]->CodeLen * EACHCALNUM * (npoints[value2ColNum] + 1)];
memset(value2forWave[value2ColNum],0,tslfwave[value2ColNum]->CodeLen * EACHCALNUM * (npoints[value2ColNum] + 1));
}
}
int *eachCurdataNum = new int[ncurvs]; //记录每轮各个曲线保存在value2中的数值个数
for(int i = 0; i < ncurvs; i++){
eachCurdataNum[i] = 0;
}
float firstDep;
float eachStartDep;
float lastStartDep;
int rNum = 0;
DepthProgress MyDepthProgress;
MyDepthProgress.CreatProgress(outsdep,outedep,"解编LIS数据");
if(isSpLis)ngapbyte = ngapbyteSpFirst;
int nn=0;
while(1)
{
// read a logical record (many physical record).
DWORD f = ftell(fp);
rdbuf(fp,buff,&lbuff,&lrtype,&istats,maxrl,&nbyte,ngapbyte);
if(isSpLis)ngapbyte=8;
f = ftell(fp);
if(f < 0) {
break;
}
ntbyte = ntbyte + nbyte;
if(istats<=0) {
break;
}
// if(lrtype!=lrtype0) write(0,*) "lbuff,lrtype,nrecs=",lbuff,lrtype,nlr;
lrtype0=lrtype;
#pragma region write vol.(reel)_header information.
if(lrtype == 132)
{
// str=reelhd((char *)&buff[0]);
}
#pragma endregion
#pragma region write vol.(reel)_trail information.
else if(lrtype==133)
{
strncpy(mbuf,(char *)&buff[2],lbuff-3+1);
mbuf[lbuff-3+1]=0;
// str.Format("*** reel trail *** %s",mbuf);
// skip vol.(reel) trail bytes (2 eof)
len = neofbyte * 2;
if(len > 0)
{
istat = fread(buff, len, 1, fp);
if(istat<=0) {
break;
}
}
ntbyte=ntbyte+neofbyte*2;
sprintf(mbuf,"ntbytes = %d\r\n two eof \r\n",ntbyte);
// str+=CharToCstring(mbuf,strlen(mbuf));
// skip vol.(reel) trail bytes (2 eof)
len=neofbyte*2;
if(len>0)
{
istat=fread(buff,len,1,fp);
if(istat<=0) {
break;
}
}
ntbyte=ntbyte+neofbyte*2;
}
#pragma endregion
#pragma region write tape_header information.
else if(lrtype==130)
{
// str=
tapehd((char *)buff);
// skip eof(file end) bytes(a eof).
len=neofbyte;
if(len > 0) {
istat = fread(buff,len,1,fp);
if(istat<=0) {
break;
}
}
ntbyte=ntbyte+neofbyte;
// str.Format(str.GetString(),"ntbytes = %d\r\n a eof \r\n",str,ntbyte);
}
#pragma endregion
#pragma region write tape_trail information.
else if(lrtype == 131)
{
if(lbuff-3+1<5000)
{
strncpy(mbuf, (char *)&buff[2], lbuff - 3 + 1);
// str.Format("*** tape trail *** %s",mbuf);
}
}
#pragma endregion
#pragma region write file_header information.
else if(lrtype == 128)
{
ipfile = ipfile + 1;
if(ipfile > iprdfl)
break;
//str=CString(" *** file header ***\r\n-----------------------------------\r\n")+
filehd((char *)buff, &maxrl);
//str.Format("%s maxrl=%d\r\n",str,maxrl) ;
}
#pragma endregion
#pragma region write file_trail information.
else if(lrtype==129)
{//whp add
if(ipfile==iprdfl)
{
filehd((char *)buff,&maxrl);
}
// skip eof (file end) bytes(a eof).
len=neofbyte;
if(len>0)
{
istat=fread(buff,len,1,fp);
if(istat<=0) {
break;
}
}
ntbyte=ntbyte+neofbyte;
if(ipfile==iprdfl)break;
}
#pragma endregion
#pragma region write comment record information.
else if(lrtype==232)
{
if(ipfile!=iprdfl)continue;
if(lbuff-3+1<5000)
{
strncpy(mbuf,(char *)&buff[2],lbuff-3+1);
// str.Format("*** comment: ***%s",mbuf);
}
}
#pragma endregion
#pragma region write information record information.
else if(lrtype==34)
{
if(ipfile!=iprdfl)continue;
infrec((char *)buff,lbuff,0);
}
#pragma endregion
#pragma region write format specification record information.
else if(lrtype==64)
{
if(ipfile!=iprdfl) continue;
nfmsp=nfmsp+1;
if(nfmsp>1)continue;// goto L119;
int iswfmtb=0;
iswfmtb=1;
for(int i=0;i<ncurvs+1;i++)
{
if(nsamps[i]<=0) nsamps[i]=1;
}
// write channel object information.
nfrmob=0;
npfrmob[nfrmob]=nsamps[0];
for(int i=0;i<ncurvs;i++)
{
int infg=1;
for(int j=0;j<=nfrmob;j++)
{
if(nsamps[i]==npfrmob[j]) infg=0;
}
if(infg==1)
{
nfrmob=nfrmob+1;
npfrmob[nfrmob]=nsamps[i] ;
}
//if(iexst[i]==1)
{
int ivorg=0;
int ivcopy=0 ;
int ndim=1;
nele[0]=npoints[i]/nsamps[i];
}
}
depfc=unitfactor(depunit,4);
rlevfc=unitfactor(levunit,4);
strcpy(depunit,"m");
int ip=0;
int nn=0;
for(int i=0;i<=nfrmob;i++)
{
lrecf[i]=4*npfrmob[i];
for(int ioc=0;ioc<ncurvs;ioc++)
{
if(iexst[ioc]==1&&nsamps[ioc]==npfrmob[i])
{
int nsamp=npoints[ioc];
lrecf[i]=lrecf[i]+lwbytes(ircodes[ioc])*nsamp;
}
}
}
}
#pragma endregion
#pragma region lrtype==0
else if(lrtype == 0)
{
int ips, nsamp, icode, npbyte;
if(ipfile != iprdfl)
continue;
nlrdat = nlrdat + 1;
int nfrm = (lbuff - 2) / lframe;
if(nfrm>255) nfrm=255;
if(nfrm != nframe)
nframe = nfrm;
// nframe=buff[0]*0x100+buff[1];
for(int i = 0; i < nframe; i++)
{
#pragma region 深度值dep更新
if(modep == 1)
{
ips=3;
nsamp=1;
icode=ircodes[ncurvs] ;
convrt(&value[0], buff, lbuff, ips, icode, nsamp);
dep = value[0] * depfc + outrlev * i;
}
else
{
ips=2+ipost[ncurvs]+(i)*lframe;
nsamp=1;
icode=ircodes[ncurvs];
convrt(&value[0],buff,lbuff,ips,icode,nsamp);
dep=value[0]*depfc ;
}
irec=irec+1;
if(abs(dep + abstrv) > 0.01 && ifgst == 0 && abs(dep + 9999.) > 0.01)
{
ifgst = irec;
vsdep = dep;
if(irec != 1)
{
// CString ss;
// ss.Format("irec=d,warning! depth track value error.",irec);
}
}
if(abs(dep + abstrv) > 0.01 && abs(dep + 9999.) > 0.01)
{
ifged = irec;
vedep = dep;
}
#pragma endregion
if(outrlev < 0){
if(rNum == 0)
firstDep = dep;
rNum++;
if(rNum == EACHCALNUM)
eachStartDep = dep; //更新一次起始深度值
}
else if(outrlev > 0){
if(rNum == 0)
eachStartDep = dep;
rNum++;
if(rNum == EACHCALNUM)
firstDep = dep;
}
lastStartDep = dep;
for(int l = 0; l <= nfrmob; l++)
{
int ipw=4;
#pragma region write curve value to buft.
for(int j = 0; j < ncurvs; j++) //针对于每个曲线
{
if(OutCurveNo[j] > -1 && npfrmob[l] == nsamps[j])
{
if(modep==1)
ips = 6 + ipost[j] + (i) * lframe;
else
ips=2+ipost[j]+(i)*lframe;
nsamp=npoints[j];
icode=ircodes[j];
convrt(&value[0],buff,lbuff,ips,icode,nsamp);
nn++;
for(int k = 0; k < nsamp; k++)
{
if(abs(value[k]+9999.) < 0.001||
value[k]>=1.312924e+030||
fabs(value[k]+431602048.0)==0
||
value[0]>=1.1424783e+009
)
{
value[k]=-999.25;
}
}
if(nsamp > 1 && outrlev < 0)
{
#pragma region 存放curdata --> value[]
if(ndim[j]<=1)//curve
{
float *temp;
temp = new float[nsamp];
memcpy(&temp[0], &value[0], nsamp*sizeof(float));
for(int k = 0; k < nsamp; k++)
{
value[k] = temp[nsamp-k-1];
}
delete temp;
}
else if(ndim[j] > 1)//wave
{
int num = nsamp / ndim[j];
if(num > 1)
{
float *temp;
temp = new float[nsamp];
memcpy(&temp[0], &value[0], nsamp * sizeof(float));
for(int m=0;m<num;m++)
{
memcpy(&value[ndim[j] * m], &temp[nsamp-ndim[j]*(m+1)], ndim[j]*sizeof(float));
}
delete temp;
}
}
#pragma endregion
}
if(ndim[j]<1)
ndim[j] = 1;
float mrlev = outrlev / (npoints[j]/ndim[j]);
if(dep > edep || dep < sdep)
{
//sdep--edep在输出深度段外无需操作
}
else
{
if(ndim[j] <= 1) //常规曲线
{
float StartDep = dep;
int NumPoint = nsamp, StartPoint = 0;
if(dep < sdep)
{
#pragma region 起始深度在段外
for(int m = 0; m < nsamp; m++)
{
if(dep + m * mrlev >= sdep)
{
StartDep += m * mrlev;
StartPoint = m;
NumPoint -= m;
break;
}
}
#pragma endregion
}
if(dep + (nsamp - 1) * mrlev > edep)
{
#pragma region 终止深度在段外
for(int m = 0; m < nsamp; m++)
{
if(dep + m * mrlev >= edep)
{
NumPoint = m + 1;
break;
}
}
#pragma endregion
}
//int po = (StartDep - myCurve.StartDepth) / myCurve.DepLevel + 0.5;
if(outrlev < 0)
{
for (int NumPointn = 0; NumPointn < NumPoint; NumPointn++)
{
if(NumPoint > 1)
value2[j][(EACHCALNUM - eachCurdataNum[j] - 1) * NumPoint + NumPointn] = value[StartPoint + NumPointn];
else
value2[j][EACHCALNUM - eachCurdataNum[j] - NumPointn - 1] = value[StartPoint + NumPointn];
}
eachCurdataNum[j] ++;
}
else
{
for (int NumPointn = 0; NumPointn < NumPoint; NumPointn++)
value2[j][ eachCurdataNum[j] * NumPoint + NumPointn ] = value[StartPoint + NumPointn];
eachCurdataNum[j] ++;
}
}
else //波列数据
{
int num = nsamp / ndim[j];
int lb=lbytes(ircodes[j]);
float StartDep=dep;
int po=(StartDep-myWave.StartDepth)/myWave.DepLevel+0.5;
int NumPoint=num,StartPoint=0;
if(dep<sdep)//起始深度在段外
{
for(int m=0;m<num;m++)
{
if(dep+m*mrlev>=sdep)
{
StartDep+=m*mrlev;
StartPoint=m;
NumPoint-=m;
break;
}
}
}
if(dep + (num - 1) * mrlev > edep)//终止深度在段外
{
for(int m = 0; m < num; m++)
{
if(dep + m * mrlev >= edep)
{
NumPoint = m + 1;
break;
}
}
}
if(outrlev < 0){
for (int NumPointn = 0; NumPointn < num * ndim[j]; NumPointn++)
m_SlfFile.SetData(tslfwave[j]->RepCode,&value2forWave[j][tslfwave[j]->CodeLen*((EACHCALNUM - eachCurdataNum[j] - 1) * nsamp + NumPointn)],&value[StartPoint * ndim[j] + NumPointn]);
eachCurdataNum[j]++;
}
else{
for (int NumPointn = 0; NumPointn < num * ndim[j]; NumPointn++)
m_SlfFile.SetData(tslfwave[j]->RepCode,&value2forWave[j][tslfwave[j]->CodeLen*(eachCurdataNum[j] * nsamp + NumPointn) ],&value[StartPoint * ndim[j] + NumPointn]);
eachCurdataNum[j]++;
}
}
}
}
}
#pragma endregion
int iprec = irec - ifgst + 1;
}
rNum=0;
if(rNum != EACHCALNUM);
// continue;
#pragma region 完成一轮次的数据获取,进行一轮次的录入
for(int j = 0; j < ncurvs; j++)
{
if(OutCurveNo[j] > -1 && ndim[j] <= 1) //常规数据
{
//实际所需录入个数计算
int realSaveNum = abs((firstDep - eachStartDep) / outrlev) + 1.5;
realSaveNum += 1; //补一个临点
/*
//补差
int cNum = realSaveNum - eachCurdataNum[j];
for(int c = 0; c < cNum; c++)
{
for(int cnpoints = 0; cnpoints < npoints[j]; cnpoints++)
{
int temp_newIndex = abs(eachCurdataNum[j] * npoints[j] + c * npoints[j] + cnpoints);
int temp_oldIndex = abs(eachCurdataNum[j] * npoints[j] - npoints[j] + cnpoints);
value2[j][temp_newIndex] = value2[j][temp_oldIndex];
}
}
*/
//录入
int value2Index = 0;
float saveStartDep = 0.0;
//if(cal_SaveNumInf(outsdep, outedep, outrlev, eachStartDep, value2Index, realSaveNum, saveStartDep))
{
if(npoints[j]>1)
{
m_SlfFile.WriteCurve(OutCurveNo[j], dep-rlev+rlev/npoints[j], npoints[j], &value2[j][value2Index * npoints[j]]);
}
else m_SlfFile.WriteCurve(OutCurveNo[j], dep, npoints[j], &value2[j][value2Index * npoints[j]]);
}
}
else if(OutCurveNo[j] > -1 && ndim[j] > 1) //波形数据
{
int num = npoints[j] / ndim[j];
int value2Index = 0;
float saveStartDep = 0.0;
int realSaveNum = eachCurdataNum[j];
//if(cal_SaveNumInf(outsdep, outedep, outrlev, eachStartDep, value2Index, realSaveNum, saveStartDep))
{
if(num>1)
{
m_SlfFile.WriteCurve(OutCurveNo[j], dep-rlev+rlev/num,eachCurdataNum[j] * num, &value2[j][value2Index * npoints[j]]);
}
else m_SlfFile.WriteWave(OutCurveNo[j], dep, eachCurdataNum[j] * num, (void*)&value2forWave[j][0]);
}
}
}
// 初始化
for(int i = 0; i < ncurvs; i++)
eachCurdataNum[i] = 0;
rNum = 0;
//进度条刷新
if(outrlev < 0)
MyDepthProgress.SetDepth(outedep - eachStartDep + outsdep);
else
MyDepthProgress.SetDepth(dep);
#pragma endregion
}
}
#pragma endregion
nlr = nlr + 1; // skip vol trail
}
fclose(fp);
// 剩余数据录入
if(rNum != 0 && outrlev < 0)
{
for(int j = 0; j < ncurvs; j++)
{
if(OutCurveNo[j] <= -1) continue;
if(ndim[j] <= 1) //curve
{
int value2Index = 0, realSaveNum = eachCurdataNum[j];
float saveStartDep = 0.0;
if(cal_SaveNumInf(outsdep, outedep, outrlev, lastStartDep, value2Index, realSaveNum, saveStartDep))
{
value2Index = abs(EACHCALNUM - realSaveNum);
m_SlfFile.WriteCurve(OutCurveNo[j], saveStartDep, realSaveNum * npoints[j], &value2[j][value2Index * npoints[j]]);
}
}
else //wave
{
int num = npoints[j] / ndim[j];
int value2Index = 0, realSaveNum = eachCurdataNum[j];
float saveStartDep = 0.0;
if(cal_SaveNumInf(outsdep, outedep, outrlev, eachStartDep, value2Index, realSaveNum, saveStartDep))
{
value2Index = abs(EACHCALNUM - realSaveNum);
m_SlfFile.WriteWave(OutCurveNo[j], saveStartDep, realSaveNum * num, (void*)&value2forWave[j][tslfwave[j]->CodeLen * (value2Index * npoints[j])] );
}
//m_SlfFile.WriteWave(OutCurveNo[j], lastStartDep, eachCurdataNum[j]*num,(void*)&value2forWave[j][tslfwave[j]->CodeLen*((EACHCALNUM - eachCurdataNum[j]) * npoints[j])]);
}
}
}
else if(rNum != 0 && outrlev > 0)
{
for(int j = 0; j < ncurvs; j++)
{
if(OutCurveNo[j] <= -1) continue;
if(ndim[j] <= 1)
{
int value2Index = 0, realSaveNum = eachCurdataNum[j];
float saveStartDep = 0.0;
if(cal_SaveNumInf(outsdep, outedep, outrlev, eachStartDep, value2Index, realSaveNum, saveStartDep))
{
m_SlfFile.WriteCurve(OutCurveNo[j], saveStartDep, realSaveNum * npoints[j], &value2[j][value2Index * npoints[j]]);
}
}
else
{
int num = npoints[j] / ndim[j];
int value2Index = 0;
float saveStartDep = 0.0;
int realSaveNum = eachCurdataNum[j];
if(cal_SaveNumInf(outsdep, outedep, outrlev, eachStartDep, value2Index, realSaveNum, saveStartDep))
m_SlfFile.WriteWave(OutCurveNo[j], saveStartDep, realSaveNum * num, (void*)&value2forWave[j][value2Index * npoints[j]]);
//m_SlfFile.WriteWave(OutCurveNo[j], eachStartDep, eachCurdataNum[j] * num, (void*)&value2forWave[j][0]);
}
}
}
delete eachCurdataNum;
for (int i = 0; i < ncurvs; i++)
{
if(OutCurveNo[i]>-1)
{
if(tslfwave&&tslfwave[i]) delete tslfwave[i];
delete[] value2[i];
}
}
delete[] value2;
if(tslfwave) delete[] tslfwave;
for (int i = 0; i < ncurvs; i++)
{
if(OutCurveNo[i] > -1 && ndim[i] > 1)
delete[] value2forWave[i];
}
delete[] value2forWave;
for(int j = 0; j < ncurvs; j++)
{
if(OutCurveNo[j] > -1)
if(ndim[j] <= 1)
m_SlfFile.CloseCurve(OutCurveNo[j]);
else
m_SlfFile.CloseWave(OutCurveNo[j]);
}
m_SlfFile.Close();
return TRUE;
}
BEGIN_REGISTER_ICONVERTOR(CLisConvertor)
sConvertorKey(GetLisConvertorTypeID(),"Lis Well Log Convertor")
END_REGISTER_ICONVERTOR(CLisConvertor );
END_OSGGRAPHICS_NAMESPACE