logplus/tran/LISConvertor/src/LisConvertor.cpp

1426 lines
36 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"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