#pragma warning( push ,0) #include"LisConvertor.h" #include #include #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 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 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 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 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 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;i0) { //特殊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;i0.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;iedep) { 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 -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;i255) 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 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) { 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