#include "MemRdWt.h" #include "math.h" #include CMemRdWt ::CMemRdWt(const char *wellname,bool bconst,int FileType):CLogIO(wellname,FileType) { Initialize(bconst); } void CMemRdWt ::Initialize(bool bconst) { ZoneSdep=-99999; ZoneEdep=-99999; isfirstrun=false; INC=NULL; OUTC=NULL; INP=NULL; OUTP=NULL; CONC=NULL; CON=NULL; HD=NULL; OutCurveType=NULL; SlfError=NULL; ConstFileName=NULL; InData=NULL ; OutData=NULL; InCurveNo=NULL; OutCurveNo=NULL; ConstBuffer=NULL; InSdep=NULL; InEdep=NULL; OutSdep=NULL; OutEdep=NULL; Inflag=0; SaveFlag=0; Inflag=0; InData=NULL; OutData=NULL; InCurveNo=NULL; OutCurveNo=NULL; if(bconst) { ConstBuffer=new char[8192]; *ConstBuffer='\0'; } else ConstBuffer=NULL; RunSdep=-999999; RunEdep=-999999; Rlev=99999; SaveFlag=0; memset(&m_Channel,0,sizeof(Slf_CHANNEL)); memset(&m_Wave,0,sizeof(Slf_WAVE)); memset(&m_Curve,0,sizeof(Slf_CURVE)); } bool CMemRdWt ::Open(const char *wellname,unsigned int nOpenFlags,int BlockLen,int MaxObjectNumber, int MachineType,int FileType) { Initialize(FALSE); return CLogIO ::Open(wellname,nOpenFlags,BlockLen,MaxObjectNumber,MachineType,FileType); } CMemRdWt ::CMemRdWt() { Initialize(); } void CMemRdWt::ChangeName(struct INC_STRU *Inc, struct OUTC_STRU *Outc, struct CONC_STRU *Conc, struct CON_STRU *Con ) { isfirstrun=0; if(Inc&&strchr(Inc->Name,':')) { QString tcs=Inc->Name; tcs.replace("\t",""); strcpy(Inc->Name,tcs.toStdString().c_str()); int len=strlen(Inc->Name); if(len>24576) len=24576; char *name=new char[len+1]; memmove(name,Inc->Name,len+1); memset(Inc->Name,0,24576); char *p=name; for(int i=0;iNoi;i++) { char *p1=strchr(p,':'); if(!p1) { AfxMessageBox("输入曲线名称、描述、单位与曲线个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1='\0'; strcat(Inc->Name,p); int ssl=strlen(p); for(int ccc=ssl;ccc<8;ccc++) strcat(Inc->Name," "); int pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); if(!p1) { AfxMessageBox("输入曲线名称、描述、单位与曲线个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1=0; strcat(Inc->Script,p); // strcat(Inc->Script,";"); pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); if(!p1) { AfxMessageBox("输入曲线名称、描述、单位与曲线个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1=0; if(strlen(p)) { strcat(Inc->Script,"("); strcat(Inc->Script,p); strcat(Inc->Script,")"); } strcat(Inc->Script,";"); strcat(Inc->Unit,p); strcat(Inc->Unit,";"); pl=p1-p; p+=pl+1; p1++; } delete name; } if(Outc&&strchr(Outc->Name,':')) { QString tcs=Outc->Name; tcs.replace("\t",""); strcpy(Outc->Name,tcs.toStdString().c_str()); int len=strlen(Outc->Name); if(len>24576) len=24576; char *name=new char[len+1]; memmove(name,Outc->Name,len+1); memset(Outc->Name,0,24576); char *p=name; for(int i=0;iNoo;i++) { char *p1=strchr(p,':'); if(!p1) { AfxMessageBox("输出曲线名称、描述、单位与输出曲线个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1='\0'; strcat(Outc->Name,p); int ssl=strlen(p); for(int ccc=ssl;ccc<8;ccc++)strcat(Outc->Name," "); int pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); if(!p1) { AfxMessageBox("输出曲线名称、描述、单位与输出曲线个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1=0; strcat(Outc->Script,p); pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); if(!p1) { AfxMessageBox("输出曲线名称、描述、单位与输出曲线个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1=0; if(strlen(p)) { strcat(Outc->Script,"("); strcat(Outc->Script,p); strcat(Outc->Script,")"); } strcat(Outc->Script,";"); strcat(Outc->Unit,p); strcat(Outc->Unit,";"); pl=p1-p; p+=pl+1; p1++; } delete name; } if(Conc&&strchr(Conc->Name,':')) { QString tcs=Conc->Name; tcs.replace("\t",""); strcpy(Conc->Name,tcs.toStdString().c_str()); int len=strlen(Conc->Name); if(len>40960) len=40960; char *name=new char[len+1]; memmove(name,Conc->Name,len+1); memset(Conc->Name,0,40960); strcpy(Con->stryy,""); char *p=name; for(int i=0;iNoc;i++) { char *p1=strchr(p,':'); if(!p1) { AfxMessageBox("输入参数名称、描述、单位个数与参数个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1='\0'; strcat(Conc->Name,p); int ssl=strlen(p); for(int ccc=ssl;ccc<8;ccc++)strcat(Conc->Name," "); int pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); if(!p1) { AfxMessageBox("输入参数名称、描述、单位个数与参数个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1=0; strcat(Conc->Script,p); pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); *p1=0; if(strlen(p)) { strcat(Conc->Script,"("); strcat(Conc->Script,p); strcat(Conc->Script,")"); } strcat(Conc->Script,";"); strcat(Conc->Unit,p); strcat(Conc->Unit,";"); pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); if(!p1) { AfxMessageBox("输入参数名称、描述、单位个数与参数个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1=0; strcat(Conc->Options,p); strcat(Conc->Options,";"); pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); if(!p1) { AfxMessageBox("输入参数名称、描述、单位个数与参数个数不匹配!\n可能原因:参数信息太长、缺少';'等"); break; } *p1=0; strcat(Conc->ValType,p); strcat(Conc->ValType,";"); pl=p1-p; p+=pl+1; p1++; p1=strchr(p,';'); if(p1) { *p1=0; } else { int aa=1; } strcat(Con->stryy,p); strcat(Con->stryy,","); Con->yy[i]=atof(p); pl=p1-p; p+=pl+1; p1++; } delete name; } } void CMemRdWt::SetStruct( struct INC_STRU *Inc, struct OUTC_STRU *Outc, struct INP_STRU *Inp, struct OUTP_STRU *Outp, struct CONC_STRU *Conc, struct CON_STRU *Con, struct HD_STRU *Hd, struct LogType *OutType, struct ErrorInf *Errorinf ) { OldINC =INC; OldOUTC=OUTC; OldCONC=CONC; OldINP =INP; OldOUTP=OUTP; OldCON=CON; OldHD=HD; OldOutCurveType=OutCurveType; OldSlfError=SlfError; INC =Inc; OUTC=Outc; CONC=Conc; INP =Inp; OUTP=Outp; CON=Con; HD=Hd; OutCurveType=OutType; SlfError=Errorinf; ChangeName(Inc,Outc,Conc,Con); } void CMemRdWt::LoadOldStruct() { INC =OldINC; OUTC=OldOUTC; CONC=OldCONC; INP =OldINP; OUTP=OldOUTP; CON =OldCON; HD =OldHD; OutCurveType=OldOutCurveType; SlfError=OldSlfError; } int CMemRdWt ::GetInCurveCount() { if(INC) return INC->Noi; else return 0; } int CMemRdWt ::GetOutCurveCount() { if(OUTC) return OUTC->Noo; else return 0; } char * CMemRdWt ::OpenCord(const char* szLogFileName) { DWORD bytes; ConstFileName=szLogFileName; if(ConstBuffer==NULL) { ConstBuffer=new char[8192+1]; } *ConstBuffer='\0'; int index=OpenStream(ConstFileName); if(index<0) GetParam(); else { int length=GetStreamLength(index); if(ConstBuffer) delete ConstBuffer; ConstBuffer=new char[length+1]; ReadStream(index,length,&bytes,ConstBuffer); ConstBuffer[bytes]='\0'; } if(index>-1)CloseStream(index); return ConstBuffer; } char* CMemRdWt::GetParam() { int jj; char *pp; char buf[100]; char name[100]; if(!CONC) return ConstBuffer; CString cs; pp=CONC->Name; if(*pp&&!CONC->Noc) { cs+=CString(CONC->Name); } else { cs.Format("%g %g\r\n",HD->Sdep,HD->Edep); for(int i=0;iNoc;i++) { jj=0; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[jj++]=toupper(*pp++); while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[jj]='\0'; if(i!=CONC->Noc-1) sprintf(buf,"%s=%g,",name,CON->yy[i]); else sprintf(buf,"%s=%g\r\n",name,CON->yy[i]); cs+=CString(buf); if((i+1)%10==0&&i!=CONC->Noc-1) cs+=CString("\r\n"); } cs+=CString("/*\r\n"); } //这几句加上后,新产生参数卡时不正确 if(ConstBuffer) delete ConstBuffer; ConstBuffer=new char[cs.GetLength()+1]; strcpy(ConstBuffer,cs.GetString()); return ConstBuffer; } void CMemRdWt ::SaveCord(const char* szLogFileName,char *pBuf) { DWORD bytes; ConstFileName=szLogFileName; if(!ConstFileName) return; if(!pBuf) return; if(!ConstBuffer) { ConstBuffer=new char[strlen(pBuf)+1]; strcpy(ConstBuffer,pBuf); } else { delete ConstBuffer; ConstBuffer=new char[strlen(pBuf)+1]; strcpy(ConstBuffer,pBuf); } int index=OpenStream(ConstFileName); if(index<0) { if(strlen(ConstBuffer)<=0) GetParam(); index=CreateStream(PARA_OBJECT/*STREAM_OBJECT*/,ConstFileName); } if(index){ WriteStream(index,strlen(ConstBuffer)+1,&bytes,ConstBuffer); CloseStream(index); } } QString getStrValue(char *stryy,int pos)//stryy 输入字符串缓冲器,pos 参数号,1开始 { QString str=stryy; QStringList strlst=str.split(";"); if(strlst.size()>pos-1) return strlst[pos-1]; else return QString(); } CMemRdWt ::~CMemRdWt() { Close(); } int CMemRdWt::GetInCurveName(int CurveNo,char *InName) { if(!INC) return 0; char *pp=INC->Name; char name[200]; for(int i=0;iNoi;i++) { int jj=0; char *pf=pp; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[jj++]=toupper(*pp++); while(*pp==' '||*pp=='\t') pp++; if(*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[jj]='\0'; if(CurveNo==i) { strcpy(InName,name); return 1; } } return 0; } int CMemRdWt::GetOutCurveName(int CurveNo,char *OutName) { if(!OUTC) return 0; char name[200]; char *pp=OUTC->Name; for(int i=0;iNoo;i++) { int jj=0; char *pf=pp; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[jj++]=toupper(*pp++); while(*pp==' '||*pp=='\t') pp++; if(*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[jj]='\0'; if(CurveNo==i) { strcpy(OutName,name); return 1; } } return 0; } int CMemRdWt::Const() { if(!HD) { // AfxMessageBox("缺少HD!"); return 0; } if(SlfError){ strcpy(SlfError->ErrorStr,""); SlfError->ErrorNo=0; } HD->Stdep=9999; HD->Endep=-9999; char *p,*pp; char vst[100],var[100],name[100]; int i=-1,k=0,j=0,right=0,jj=0; float Sdep=0.0,Edep=0.0; if(!CONC) { return 0; } if(!ConstBuffer) { if(strlen(HD->Param)>0) OpenCord((const char* )HD->Param); else { // AfxMessageBox("应用模块开发不规范,缺少参数缓冲区!"); return 0; } } // // 取深度段=》 SDEP EDEP // QString tw=ConstBuffer; tw.replace(",",","); tw.replace("\r\n","\n"); tw.replace("\r","\n"); tw.replace(" \n","\n"); tw.replace("\n","\r\n"); QStringList tws=tw.split("\r\n"); tws.removeAll(""); for(int i=0;i深度对错误,将被忽略!"; tws[i]=""; if(!isfirstrun)AfxMessageBox(cs); for(int j=i+1;j-1) { QString ss=ls[j].mid(k+1); if(ss.indexOf('=')>-1){ AfxMessageBox("参数卡错误:"+ls[j]); return -1; } } } } tw=tws.join("\r\n"); if(strlen(tw.toStdString().c_str())<1) { return 0; } char *pTemp=new char[strlen(tw.toStdString().c_str())+1]; strcpy(pTemp,tw.toStdString().c_str()); int d=0; p=pTemp; // // 取深度段=》 SDEP EDEP // QStringList mes; int isend0=0; p=pTemp; while(1) { i=-1,k=0,j=0,right=0,jj=0; while(*p==' '||*p=='\t') p++; while(*p==0x0d) p++; while(*p==0x0a) p++; if(!*p) break; if(strncmp(p,"END",3)==0||strncmp(p,"end",3)==0) { isend0=true; break; } if(strncmp(p,"/*",2)==0) { isend0=true; break; } int Flag=0; if(isalpha(*p)) goto next; while(*p!=0x0a&&*p!=0) { // Flag=1; if(*p>=0x30&&*p<=0x39||*p=='.') { if(i==-1) { i=k; pp=p; }; } else if(i>-1) { char buf[20]; strncpy(buf,pp,k-i); buf[k-i]='\0'; if(j==0) { if(Sdep&&(float)atof(buf)!=Edep) { char temm[200],temm1[200]; temm1[0]=0; int t=strchr(pp,0x0d)-pp; if(t>0) { strncpy(temm1,pp,t); temm1[t]=0; } sprintf(temm,"深度段%s与前一段%g-%g不连续!",temm1,Sdep,Edep); if(SlfError){ strcpy(SlfError->ErrorStr,temm); SlfError->ErrorNo=-1; } if(!isfirstrun){ mes.append(temm); } } Sdep=(float)atof(buf); if(SdepStdep)HD->Stdep=Sdep; j++; } else { Edep=(float)atof(buf); j++; if(Edep>HD->Endep)HD->Endep=Edep; } while(*p==' '||*p=='\t') p++; if(*(p-1)==' '||*(p-1)=='\t') p--; i=-1; } p++; k++; } if(j>0&&j<2) { char v[100]; sprintf(v,"深度段错误:%g",Sdep); if(SlfError){ strcpy(SlfError->ErrorStr,v); SlfError->ErrorNo=-1; } mes.append(v); Edep=Sdep; } if(j) { if(Sdep>10000||Edep>10000) { char v[100]; sprintf(v,"深度段异常:%g %g",Sdep,Edep); if(SlfError){ strcpy(SlfError->ErrorStr,v); SlfError->ErrorNo=-1; } mes.append(v); Sdep=0; Edep=0; } } next:; //if(SdepStartDep) Sdep=HD->StartDep; //if(Edep>HD->EndDep&&HD->EndDep>HD->StartDep) Edep=HD->EndDep; // //跳过行尾 // if(*p=='\0') break; if(Flag)p++; // right=0;i=0;j=0; int eq=0; while(*p!=0x0) { while(*p==' '||*p=='\t') p++; // // "//"为注释行 // if(*p=='/') { p++; if(*p=='/') { if(strchr(p,0x0a)) { p=strchr(p,0x0a);p++; } } else { // // “/*”为卡片结尾标志 // if(*p=='*') { while(*p!='\0') p++; break; } } } if(strncmp(p,"END",3)==0|| strncmp(p,"end",3)==0) { isend0=true; p+=3; break; } // // 行首为数字表示为深度段 // if(*p>=0x30&&*p<=0x39) break; while(*p!=0x0d){ if(*p=='\0') break; while(*p==' '||*p=='\t') p++; // =左界--- if(!right) { if(*p!='='&&*p!='<'&&*p!='>') vst[i++]=toupper(*p); else { vst[i]='\0'; right=1; if(*p=='<') eq=1; if(*p=='>') eq=2; } } // =右界--- else { // // "," "\n" 结束当前参数 // if(*p!=','&&*p!=0xd&&*p!=0x0a&&*p!='\t') var[j++]=*p; if(*p==','||*p==0xd||*p==0x0a||*p=='\t'||(*(p+1)==0x0d&&*p!=',')) { var[j]='\0'; if(eq==1&&INC) { pp=INC->Name; while(pp&&*pp==' ') pp++; for(i=0;iNoi;i++) { jj=0; char *pf=pp; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[jj++]=toupper(*pp++); while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; int pl=pp-pf; name[jj]='\0'; if(strcmp(vst,name)==0) { int l1=strlen(var); int l2=pp-INC->Name; int l3=strlen(INC->Name); if(l1>=pl) { char *bu=new char[l3+1]; strcpy(bu,pp-1); strcpy(pp+l1-pl+1,bu); delete bu; for(int y=0;yName; while(pp&&*pp==' ') pp++; for(i=0;iNoo;i++) { jj=0; char *pf=pp; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[jj++]=toupper(*pp++); while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; int pl=pp-pf; name[jj]='\0'; if(strcmp(vst,name)==0) { int l1=strlen(var); int l2=pp-OUTC->Name; int l3=strlen(OUTC->Name); if(l1>=pl) { char *bu=new char[l3+1]; strcpy(bu,pp-1); strcpy(pp+l1-pl+1,bu); delete bu; for(int y=0;yNoc) return 0; p=pTemp; if(CON) { if(!strchr(CON->stryy,',')||strchr(CON->stryy,',')-CON->stryy>16){ strcpy(CON->stryy,""); for(i=0;iNoc;i++) { strcat(CON->stryy,","); } } } int isend=0; Sdep=0.0,Edep=0.0; while(1) { i=-1,k=0,j=0,right=0,jj=0; while(*p==' '||*p=='\t') p++; while(*p==0x0d) p++; while(*p==0x0a) p++; if(!*p) break; if(strncmp(p,"END",3)==0||strncmp(p,"end",3)==0) { isend=true; break; } if(strncmp(p,"/*",2)==0) { isend=true; break; } while(strchr(p,'<')) { while(*p!=0x0a&&*p) p++; p++; } while(strchr(p,'>')) { while(*p!=0x0a&&*p) p++; p++; } while(*p!=0x0a&&*p) { // if(*p>=0x30&&*p<=0x39||*p=='.') { if(i==-1) {i=k;pp=p;}; } else if(i>-1) { char buf[20]; strncpy(buf,pp,k-i); buf[k-i]='\0'; if(j==0) { Sdep=(float)atof(buf); j++; } else { Edep=(float)atof(buf); j++; } while(*p==' '||*p=='\t') p++;if(*(p-1)==' '||*(p-1)=='\t') p--; i=-1; } p++; k++; } if(j>0&&j<2) { char v[100]; sprintf(v,"深度段错误:%g",Sdep); if(SlfError){ strcpy(SlfError->ErrorStr,v); SlfError->ErrorNo=-1; } mes.append(v); Edep=Sdep; } float oldsdep=Sdep; if(HD->DepDep =Sdep; HD->Depo=Sdep; HD->Sdep=Sdep; HD->Edep=Edep; } // //跳过行尾 // if(*p=='\0') break; p++; // right=0;i=0;j=0; while(*p!=0x0) { while(*p==' '||*p=='\t') p++; // // "//"为注释行 // if(*p=='/') { p++; if(*p=='/') { if(strchr(p,0x0a)) { p=strchr(p,0x0a);p++; } } else { // // “/*”为卡片结尾标志 // if(*p=='*') { while(*p!='\0') p++; break; } } } if(strncmp(p,"END",3)==0|| strncmp(p,"end",3)==0) { isend=true; p+=3; break; } // // 行首为数字表示为深度段 // if(strlen(p)>3&&*p==13&&*(p+1)==10&&((*(p+2)>=0x30&&*(p+2)<=0x39)||strncmp(p+2,"END",3)==0||strncmp(p+2,"end",3)==0||*(p+2)=='/')) { p+=2; break; } if(*p>=0x30&&*p<=0x39) break; int eq=0; while(*p!=0x0d&&*p) { while(*p==' '||*p=='\t'||*p==0x0d||*p==0x0a) p++; // =左界--- if(!right) { if(*p!='='&&*p!='<'&&*p!='>') vst[i++]=toupper(*p); else { vst[i]='\0'; right=1; if(*p=='<') eq=1; if(*p=='>') eq=2; } } // =右界--- else { // // "," "\n" 结束当前参数 // if(*p!=','&&*p!=0xd&&*p!=0x0a&&*p!='\t') var[j++]=*p; if(*p==','||*p==0xd||*p==0x0a||*p=='\t'||(*(p+1)==0x0d&&*p!=',')) { var[j]='\0'; if(HD->Dep>=Sdep&&HD->Dep<=Edep) { char *ppp=CON->stryy; pp=CONC->Name; while (pp&&*pp==' ') { pp++; } int fflag=0; for(i=0;iNoc;i++) { jj=0; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[jj++]=toupper(*pp++); while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[jj]='\0'; if(!strstr(ppp,",")) { strcat(ppp,","); ppp+=1; } if(strcmp(vst,name)==0) { fflag=1; CON->yy[i]=(float)atof(var); if(ppp) { char *pppp=strstr(ppp,","); if(pppp) { char *a=new char[strlen(pppp)+1]; strcpy(a,pppp); ppp[0]=0; strcat(ppp,var); strcat(ppp,a); delete a; } else { ppp[0]=0; strcat(ppp,var); } if(ppp)ppp=strstr(ppp,",")+1; } break; } else if(ppp)ppp=strstr(ppp,",")+1; } if(!fflag&&HD->Dep>=Sdep&&HD->DepErrorStr,temm); SlfError->ErrorNo=-1; } mes.append(temm); fflag=1; // AfxMessageBox(temm); } } right=0;j=0;i=0; } } ++p; } if(*p=='\0') break; // //跳过行尾 // p++; if(*p==0x0a) p++; // } if(HD->Dep>=Sdep&&HD->DepSdep=Sdep; HD->Edep=Edep; if(ZoneSdep!=-99999&&HD->DepDep=Edep; HD->Endep=ZoneEdep; continue; } break; } if(isend) break; } if(isend||ZoneSdep!=-99999) { if(Edep!=0)HD->EndDep=Edep; } if(pTemp!=ConstBuffer) delete pTemp; if(HD->Sdep==99999&&HD->Edep==-99999||HD->Rlev==99999||HD->Rlev==-99999) { HD->Sdep=0; HD->Edep=0; HD->Dep=0; HD->Rlev=0.125; HD->StartDep=0; HD->EndDep=0; HD->Stdep=0; HD->Endep=0; } if(mes.size()) { ShowMessage(mes.join("\n")); return -1; } if(HD->Dep>=Sdep&&HD->DepDep>=Edep) { if(Edep!=0)HD->EndDep=Edep; return 1; } return 0; } void CMemRdWt ::SetDepthDelta(float sdep,float edep,float rlev) { RunSdep=sdep; RunEdep=edep; Rlev=rlev; } bool CMemRdWt ::AddInCurve(char *mCurve) { if(!AddInCurve(INC->Noi++,mCurve)) return 0; if(INC->Noi!=1) strcat(INC->Name," "); strcat(INC->Name,mCurve); return true; } void CMemRdWt::BackData() { int i,samples; for(i=0;iNoi;i++) { if(InCurveNo[i]>-1) { GetChannelInfo(InCurveNo[i],&m_Channel); samples=(int)((InEdep[i]-InSdep[i])/m_Channel.DimInfo[0].Delta+0.5); if(samples<0) samples=0; memmove(OutData[i],InData[i],samples*m_Channel.DimInfo[0].Size); } } } float CMemRdWt::epshft(float dest,float rlevs,float d_sdep,float d_edep,float dold1,float dold2,float dnew1,float dnew2) { int ids,k=0; double dold=d_sdep; float dnew,a,ddold; float tempdep; int iDepPos1,iDepPos2; if(dold1d_edep) dold1=d_edep; if(dold2>d_edep) dold2=d_edep; if(dnew1>d_edep) dnew1=d_edep; if(dnew2>d_edep) dnew2=d_edep; dold=dold1; ids=1; if(dnew1 >dnew2) ids=-1; if(dnew1==dnew2) { tempdep = dold2; round(&tempdep,dold1,dold2,rlevs,d_sdep,ids); // ----------------------------------------- iDepPos1 =(int)( (tempdep - d_sdep ) / rlevs+0.5); iDepPos2 =(int)( (dnew1 - d_sdep ) / rlevs+0.5); if(iDepPos1>=num) iDepPos1=num-1; if(iDepPos2>=num) iDepPos2=num-1; if(iDepPos1<0) iDepPos1=0; if(iDepPos2<0) iDepPos2=0; } else { a=(dold2-dold1)/(dnew2-dnew1); dnew=dnew1; round(&dnew,dnew1,dnew2,rlevs,d_sdep,ids); dnew=dnew-ids*rlevs; double a1=dnew; l200: a1=a1+ids*rlevs; dnew=a1; if((dnew-dnew2)*ids<=0.0) { if(dold1!=dold2) { dold=dold1+a*(dnew-dnew1); ddold=dold; if( a< 1.) { if(dnew>dold) ddold=dold2-a*k*rlevs; } if(fabsf(dold-dest)d_edep) goto l200; if(iDepPos2>=num) iDepPos2=num-1; if(iDepPos2<0) goto l200; if( a < 1.) { if(dnew>dold) { iDepPos2 = (int)( (dnew2-rlevs*k++-d_sdep)/rlevs+0.5 ); if(iDepPos2>=num) iDepPos2=num-1; if(iDepPos2<0) goto l200; } } goto l200; } } return -9999; } void CMemRdWt::epshft(int iPos,int Len,int CodeLen,float rlevs,float d_sdep,float d_edep,float dold1,float dold2,float dnew1,float dnew2,int flg,char *d_flLogData,char *d_flSavLogData) { int ids,k=0; double dold=d_sdep; float dnew,a,ddold; float tempdep; float *yy=new float[Len]; int iDepPos1=0,iDepPos2=0; if(dold1d_edep) dold1=d_edep; if(dold2>d_edep) dold2=d_edep; if(dnew1>d_edep) dnew1=d_edep; if(dnew2>d_edep) dnew2=d_edep; dold=dold1; ids=1; if(dnew1 >dnew2) ids=-1; if(dnew1==dnew2) { tempdep = dold2; round(&tempdep,dold1,dold2,rlevs,d_sdep,ids); // ----------------------------------------- iDepPos1 =(int)( (tempdep - d_sdep ) / rlevs+0.51); iDepPos2 =(int)( (dnew1 - d_sdep ) / rlevs+0.51); if(iDepPos1>=num) iDepPos1=num-1; if(iDepPos2>=num) iDepPos2=num-1; if(iDepPos1<0) iDepPos1=0; if(iDepPos2<0) iDepPos2=0; if( flg ) { GetVal(iPos,Len,&d_flSavLogData[iDepPos1*Len*CodeLen],yy); SetVal(iPos,Len,&d_flLogData[iDepPos2*Len*CodeLen],yy); } } else { a=(dold2-dold1)/(dnew2-dnew1); int count=(dnew2-dnew1)/rlevs+1.5; float dep=0; int pos=0; float old=dold1;; float val=0; val=(int)( (dnew1-d_sdep) /rlevs+0.53 ); for(int i=0;i=num) iDepPos2=num-1; if(iDepPos2<0) iDepPos2=0; inter(iPos,Len,CodeLen,d_sdep,d_edep,a,dold,old,rlevs,d_flLogData,d_flSavLogData,yy); SetVal(iPos,Len,&d_flLogData[iDepPos2*Len*CodeLen],yy); old=dold; } return; } delete yy; return; } void CMemRdWt::round(float *d,float d1,float d2,float rlevs,float stdeps,int ids) { float di; di=(int)((*d-stdeps)/rlevs); *d=(di+stdeps/rlevs)*rlevs; if((*d-d1)*ids<0.) *d=(*d/rlevs+ids)*rlevs; if((*d-d1)*ids>0.) *d=(*d/rlevs-ids)*rlevs; return; } void CMemRdWt::inter(int iPos,int nLen,int CodeLen,float d_sdep,float d_edep,float a,float d,float oldd,float rlevs,char *d_flLogData,char *d_flSavLogData,float *yy) { float *flVal1=new float[nLen]; float *flVal2=new float[nLen]; double d1,d2; int iPos1,iPos2; // ----------------------------------------- // 将要校深的曲线存放在 d_flSavLogData[d_nPointNumber]中 // 因此,做此处理 // ----------------------------------------- if( a > 1.0 ) { float dep0=d;//oldd;//累加后取平均 int nu=(d-dep0)/rlevs+1.5; if(nu<1) { nu=1; dep0=d; } for(int j=0;j=d_edep)d=d_edep; iPos2 =(int)( (d - d_sdep ) / rlevs+0.01); GetVal(iPos,nLen,&d_flSavLogData[iPos2*CodeLen*nLen],yy); } else { float rlev=rlevs; iPos1 =(int)( (d - d_sdep ) / rlevs+0.01); d1=iPos1*rlevs+d_sdep; GetVal(iPos,nLen,&d_flSavLogData[iPos1*CodeLen*nLen],flVal1); if(d1==d) { d2=d1; } if(d1d_edep) d2=d_edep; iPos2 =(int)( (d2 - d_sdep ) / rlevs+0.01); GetVal(iPos,nLen,&d_flSavLogData[iPos2*CodeLen*nLen],flVal2); for(int i=0;i xxx[j5]) { tempf5 = xxx[i5]; xxx[i5] = xxx[j5]; xxx[j5] = tempf5; } } bool CMemRdWt::EShiftWFDepth(char *Name,int Count,float *dep1,float *dep2) { if(Count<1)return 0; int iIndex=OpenWave(Name); if (iIndex >= 0) { Slf_WAVE curve; GetWaveInfo(iIndex,&curve); if(Count==2&&dep1[0]-dep1[1]==dep2[0]-dep2[1]) { if(fabs(dep1[0]-curve.StartDepth)dep2[i]) sdep=dep2[i]; if(edep= 0) { Slf_CURVE curve; GetCurveInfo(iIndex,&curve); if(Count==2&&dep1[0]-dep1[1]==dep2[0]-dep2[1]) { if(fabs(dep1[0]-curve.StartDepth)dep2[i]) sdep=dep2[i]; if(edepfile depth dep2=>change { int iIndex=OpenFMT(Name); if (iIndex < 0) return FALSE; SetFMTDepth(iIndex,Count,dep1,dep2); return TRUE; } bool CMemRdWt::EShiftTDTDepth(char *Name,int Count,float *dep1,float *dep2)//dep1 =>file depth dep2=>change { int iIndex=OpenTDT(Name); if (iIndex < 0) return FALSE; Slf_TDT Info; GetTDTInfo(iIndex,&Info); TDT_DATA *buffer=new TDT_DATA[Info.MaxLogSamples]; unsigned int t; int n=0,no; for(int i=0;i0) { for(int j=0;j-1) { QStringList csss=css[j].split(' '); csss.removeAll(" "); csss.removeAll(""); for(int k=0;kdep1[i+1]) continue; if(dep1[i+1]==dep1[i]) { dep=dep2[i]; break; } else { dep=dep2[i]+(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i]); break; } } } QString te=QString::number(dep,'f',1); css[j]+=te; if(k!=csss.size()-1) css[j]+=" "; } } } //css[j]=csss.join(" "); } } result+=css[j]+"\r\n"; } result=result.toUpper(); if(result.indexOf("END")<0) result+="END\r\n"; delete buf; WriteStream(iIndex,result.length(),&lpb,result.toStdString().c_str()); CloseStream(iIndex); return true; } bool CMemRdWt::EShiftTableDepth(char *Name,int Count,float *dep1,float *dep2) { //////////// // if Count==0,*dep1=ddep;=>深度量 // int i; int iIndex=OpenTable(Name); if (iIndex < 0) return FALSE; int numrec=GetTableRecordCount(iIndex); if(numrec<1) return FALSE; int no1=GetTableFieldNo(iIndex,"SDEP"); int no2=GetTableFieldNo(iIndex,"EDEP"); int no3=GetTableFieldNo(iIndex,"DEP"); int no4=GetTableFieldNo(iIndex,"DEPTH"); int no5=GetTableFieldNo(iIndex,"MDEPTH1"); int no6=GetTableFieldNo(iIndex,"MDEPTH2"); int no7=GetTableFieldNo(iIndex,"MDEPTH3"); int no8=GetTableFieldNo(iIndex,"MDEPTH4"); int no9=GetTableFieldNo(iIndex,"MDEPTH5"); int no10=GetTableFieldNo(iIndex,"MDEPTH6"); int no11=GetTableFieldNo(iIndex,"MDEPTH7"); int no12=GetTableFieldNo(iIndex,"MDEPTH8"); int no13=GetTableFieldNo(iIndex,"MDEPTH9"); int no14=GetTableFieldNo(iIndex,"MDEPTH10"); int no15=GetTableFieldNo(iIndex,"STARTDEP"); int no16=GetTableFieldNo(iIndex,"ENDDEP"); int no17=GetTableFieldNo(iIndex,"STDEP"); int no18=GetTableFieldNo(iIndex,"ENDEP"); if(no1<0&& no2<0&& no3<0 &&no4<0 &&no5<0 &&no6<0 &&no7<0 &&no8<0 &&no9<0 &&no10<0 &&no11<0 &&no12<0 &&no13<0 &&no14<0 &&no15<0 &&no16<0 &&no17<0 &&no18<0 ) return FALSE; int iThick=-1,iTT=-1,IsChange=-1; if(no1>=0&&no2>=0) { iThick=GetTableFieldNo(iIndex,"THICK"); iTT=GetTableFieldNo(iIndex,"TT"); } int len=GetTableRecordLength(iIndex); char *buf=new char[len+1]; float Depth,dep; for(int j=0;j-1) { GetTableFieldData(iIndex,no1,buf,j+1); sscanf(buf,"%f",&Depth); if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no1,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; IsChange=1; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no1,(char *)&dep2[i],j+1); else { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth/*-0.125*/-dep1[i])+dep2[i]; // dep+=0.125; SetTableFieldData(iIndex,no1,(char *)&dep,j+1); } } } } if(no2>-1) { //GetTableFieldData(iIndex,no2,(char *)&Depth,j+1); GetTableFieldData(iIndex,no2,buf,j+1); sscanf(buf,"%f",&Depth); if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no2,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; IsChange=1; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no2,(char *)&dep2[i],j+1); else { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth/*+0.125*/-dep1[i])+dep2[i]; //dep-=0.125; SetTableFieldData(iIndex,no2,(char *)&dep,j+1); } } } } if(no3>-1) { //GetTableFieldData(iIndex,no3,(char *)&Depth,j+1); GetTableFieldData(iIndex,no3,buf,j+1); sscanf(buf,"%f",&Depth); if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no3,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no3,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no3,(char *)&dep,j+1); } } } } if(no4>-1) { //GetTableFieldData(iIndex,no4,(char *)&Depth,j+1); GetTableFieldData(iIndex,no4,buf,j+1); sscanf(buf,"%f",&Depth); if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no4,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no4,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no4,(char *)&dep,j+1); } } } } if(no15>-1) { GetTableFieldData(iIndex,no15,buf,j+1); sscanf(buf,"%f",&Depth); if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no15,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no15,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no15,(char *)&dep,j+1); } } } } if(no16>-1) { GetTableFieldData(iIndex,no16,buf,j+1); sscanf(buf,"%f",&Depth); if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no16,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no16,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no16,(char *)&dep,j+1); } } } } if(no17>-1) { GetTableFieldData(iIndex,no17,buf,j+1); sscanf(buf,"%f",&Depth); if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no17,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no17,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no17,(char *)&dep,j+1); } } } } if(no18>-1) { GetTableFieldData(iIndex,no18,buf,j+1); sscanf(buf,"%f",&Depth); if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no18,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no18,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no18,(char *)&dep,j+1); } } } } if(no5>-1) { GetTableFieldData(iIndex,no5,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no5,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no5,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no5,(char *)&dep,j+1); } } } } } if(no6>-1) { GetTableFieldData(iIndex,no6,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no6,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no6,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no6,(char *)&dep,j+1); } } } } } if(no7>-1) { GetTableFieldData(iIndex,no7,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no7,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no7,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no7,(char *)&dep,j+1); } } } } } if(no8>-1) { GetTableFieldData(iIndex,no8,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no8,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no8,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no8,(char *)&dep,j+1); } } } } } if(no9>-1) { GetTableFieldData(iIndex,no9,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no9,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no9,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no9,(char *)&dep,j+1); } } } } } if(no10>-1) { GetTableFieldData(iIndex,no10,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no10,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no10,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no10,(char *)&dep,j+1); } } } } } if(no11>-1) { GetTableFieldData(iIndex,no11,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no11,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no11,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no11,(char *)&dep,j+1); } } } } } if(no12>-1) { GetTableFieldData(iIndex,no12,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no12,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no12,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no12,(char *)&dep,j+1); } } } } } if(no13>-1) { GetTableFieldData(iIndex,no13,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no13,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no13,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no13,(char *)&dep,j+1); } } } } } if(no14>-1) { GetTableFieldData(iIndex,no14,buf,j+1); sscanf(buf,"%f",&Depth); if(Depth) { if(Count==0) { IsChange=1; float dep=Depth+dep1[0]; SetTableFieldData(iIndex,no14,(char *)&dep,j+1); } else { for(i=0;idep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,no14,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-dep1[i])+dep2[i]; SetTableFieldData(iIndex,no14,(char *)&dep,j+1); } } } } } if(IsChange>-1) {//层的顶深或底深发生了变化 if(iThick>-1) { float sdep,edep,h; GetTableFieldData(iIndex,no1,buf,j+1); sscanf(buf,"%f",&sdep); GetTableFieldData(iIndex,no2,buf,j+1); sscanf(buf,"%f",&edep); h=edep-sdep; SetTableFieldData(iIndex,iThick,(char *)&h,j+1); } if(iTT>-1) { float sdep,edep,h; GetTableFieldData(iIndex,no1,buf,j+1); sscanf(buf,"%f",&sdep); GetTableFieldData(iIndex,no2,buf,j+1); sscanf(buf,"%f",&edep); h=edep-sdep; SetTableFieldData(iIndex,iTT,(char *)&h,j+1); } } } /////////////////////////////////////////////// /* char *name[]={ "SDEP","EDEP", "STDEP","ENDEP", "STARTDEP","ENDDEP", "DEP","DEPTH", "MDEPTH1","MDEPTH2", "MDEPTH3","MDEPTH4", "MDEPTH5","MDEPTH6", "MDEPTH7","MDEPTH8", "MDEPTH9","MDEPTH10", }; int FieldNum=GetTableFieldCount(iIndex); int no1=GetTableFieldNo(iIndex,"SDEP"); if(no1<0) no1=GetTableFieldNo(iIndex,"STDEP"); if(no1<0) no1=GetTableFieldNo(iIndex,"STARTDEP"); int no2=GetTableFieldNo(iIndex,"EDEP"); if(no2<0) no2=GetTableFieldNo(iIndex,"ENDEP"); if(no2<0) no2=GetTableFieldNo(iIndex,"ENDDEP"); if(no1>=0&&no2>=0){ iThick=GetTableFieldNo(iIndex,"THICK"); iTT=GetTableFieldNo(iIndex,"TT"); } Slf_TABLE_FIELD *FieldInfo=new Slf_TABLE_FIELD[FieldNum]; GetTableFieldInfo(iIndex,FieldInfo); for(int k=0;kdep1[i+1]) continue; if(dep1[i+1]==dep1[i]) SetTableFieldData(iIndex,n,(char *)&dep2[i],j+1); else// if(i) { dep=(dep2[i+1]-dep2[i])/(dep1[i+1]-dep1[i])*(Depth-((k==0||k==1)?0.125:0)-dep1[i])+dep2[i]; dep+=((k==0||k==1)?0.125:0); SetTableFieldData(iIndex,n,(char *)&dep,j+1); } } } } } } } } delete FieldInfo; for(int j=0;j-1) { //层的顶深或底深发生了变化 if(iThick>-1) { float sdep,edep,h; GetTableFieldData(iIndex,no1,buf,j+1); sscanf(buf,"%f",&sdep); GetTableFieldData(iIndex,no2,buf,j+1); sscanf(buf,"%f",&edep); h=edep-sdep; SetTableFieldData(iIndex,iThick,(char *)&h,j+1); } if(iTT>-1) { float sdep,edep,h; GetTableFieldData(iIndex,no1,buf,j+1); sscanf(buf,"%f",&sdep); GetTableFieldData(iIndex,no2,buf,j+1); sscanf(buf,"%f",&edep); h=edep-sdep; SetTableFieldData(iIndex,iTT,(char *)&h,j+1); } } } */ delete buf; return TRUE; } void CMemRdWt::CorrectObjectDepth(int index,float deltadepth) { char Name[65]; Name[64]='\0'; GetObjectName(index,Name); int ObjectType=GetObjectType(Name); if(ObjectType==0||ObjectType>CARD_OBJECT) { int index=OpenTable(Name); if(index>-1) { EShiftTableDepth(Name,0,&deltadepth,NULL); } } else if(ObjectType==CARD_OBJECT) { EshiftStreamDepth(Name,0,&deltadepth,NULL); } else { int index=OpenChannel(Name); if(index>-1) { short Attribute,SubAttribute; GetObjectAttribute(index,&Attribute,&SubAttribute); if(SubAttribute==CURVE_OBJECT) { CorrectDepth(index,deltadepth); } else if(SubAttribute==WAVE_OBJECT) { CorrectDepth(index,deltadepth); } } } } void CMemRdWt::CorrectAllObjectsDepth(float deltadepth) { int Count=GetObjectCount(); for(int i=0;iCARD_OBJECT||ObjectType==0) { int index=OpenTable(Name); if(index>-1) { EShiftTableDepth(Name,m_nDepPairsNum,FirstDep,SecondDep); } } else if(ObjectType==CARD_OBJECT) { EshiftStreamDepth(Name,m_nDepPairsNum,FirstDep,SecondDep); } else { int index=OpenChannel(Name); if(index>-1) { short Attribute,SubAttribute; GetObjectAttribute(index,&Attribute,&SubAttribute); if(SubAttribute==CURVE_OBJECT) { EShiftCurveDepth(Name,m_nDepPairsNum,FirstDep,SecondDep); } else if(SubAttribute==WAVE_OBJECT) { EShiftWFDepth(Name,m_nDepPairsNum,FirstDep,SecondDep); } else if(SubAttribute==FMT_OBJECT) { EShiftFMTDepth(Name,m_nDepPairsNum,FirstDep,SecondDep); } else if(SubAttribute==TDT_OBJECT) { EShiftTDTDepth(Name,m_nDepPairsNum,FirstDep,SecondDep); } } } return 1; } bool CMemRdWt::EShiftDepth(char *Name,char *pParam) { char ShiftCard[100]; int m_nDepPairsNum=0; float *FirstDep=NULL; float *SecondDep=NULL; if(!pParam) strcpy(ShiftCard,"depth_inp"); else strcpy(ShiftCard,pParam); int iIndex=OpenStream(ShiftCard); if (iIndex >= 0) { int len=GetStreamLength(iIndex); DWORD byte; float tem1,tem2; char *temp=new char[len+2]; ReadStream(iIndex,len,&byte,temp); m_nDepPairsNum=0; QString css=temp; css.trimmed(); while(css.indexOf("\r\n")>=0) { css=css.replace("\r\n","\n"); } QStringList lines=css.split('\n'); foreach(QString line,lines) { if(line.isEmpty()) continue; if(line.compare("END",Qt::CaseInsensitive)==0) break; if(!line.at(0).isDigit()&&line.at(0)!='.') continue; if(sscanf(line.toStdString().c_str(),"%f %f\n",&tem1,&tem2)<2) break; m_nDepPairsNum++; } if(m_nDepPairsNum) { FirstDep=new float[m_nDepPairsNum+1]; SecondDep=new float[m_nDepPairsNum+1]; } m_nDepPairsNum=0; foreach(QString line,lines) { if(line.isEmpty()) continue; if(line.compare("END",Qt::CaseInsensitive)==0) break; if(!line.at(0).isDigit()&&line.at(0)!='.') continue; if(sscanf(line.toStdString().c_str(),"%f %f\n",&tem1,&tem2)<2) break; SecondDep[m_nDepPairsNum]=tem1; FirstDep[m_nDepPairsNum]=tem2; m_nDepPairsNum++; } delete temp; CloseStream(iIndex); } EShiftDepth(Name,m_nDepPairsNum,FirstDep,SecondDep); delete FirstDep; delete SecondDep; return FALSE; } void CMemRdWt::RestoreData() { int i,samples; for(i=0;iNoi;i++) { if(InCurveNo[i]>-1) { GetChannelInfo(InCurveNo[i],&m_Channel); samples=(int)((InEdep[i]-InSdep[i])/m_Channel.DimInfo[0].Delta+0.5); if(samples<0) samples=0; memmove(InData[i],OutData[i],samples*m_Channel.DimInfo[0].Size); } } } bool CMemRdWt::CurveExist(int no) { if(INC&&InCurveNo&&noNoi) { if(InCurveNo[no]>=0) return 1; } return 0; } bool CMemRdWt::CurveExist(char* name) { if(INC){ for (int i=0;iNoi;i++) { if(FindObjectName(name)>-1) { if(InCurveNo) { if(InCurveNo[i]>=0) return true; } return false; } } } } bool CMemRdWt ::AddInCurve(int i,char *name) { int samples; float Dep; int MaxObjectNumber=GetMaxObjectNumber(); if(!InCurveNo) { InCurveNo=new int [MaxObjectNumber]; InData =new char*[MaxObjectNumber]; InSdep =new float [MaxObjectNumber]; InEdep =new float [MaxObjectNumber]; for(int i=0;i-1) { GetChannelInfo(InCurveNo[i],&m_Channel); if(m_Channel.RepCode>100) { QString cs=name; cs+="数据信息错误,可能是slf文件被损害!"; if(SlfError) { strcpy(SlfError->ErrorStr,cs.toStdString().c_str()); SlfError->ErrorNo=-1; } // AfxMessageBox(cs); InCurveNo[i]=-1; INP->InpLen[i]=1; INP->InpPos[i+1]=INP->InpPos[i]+INP->InpLen[i]; return false; } if(m_Channel.DimInfo[0].Delta==99999) { m_Channel.DimInfo[0].Delta=0.125; SetChannelInfo(InCurveNo[i],&m_Channel); } if(Rlev>m_Channel.DimInfo[0].Delta&&m_Channel.DimInfo[0].Delta!=99999) { Rlev=m_Channel.DimInfo[0].Delta; if(Rlev==0) Rlev=0.125; } if(RunSdep!=-999999||m_Channel.DimInfo[0].Delta>=9999) { HD->StartDep=RunSdep; HD->EndDep=RunEdep; InSdep[i]=RunSdep; InEdep[i]=RunEdep; } else { InSdep[i]=m_Channel.DimInfo[0].StartVal; if(m_Channel.DimInfo[0].Samples<1) { InEdep[i]=InSdep[i]; } else InEdep[i]=InSdep[i]+(m_Channel.DimInfo[0].Samples-1)*m_Channel.DimInfo[0].Delta; if(HD->StartDep>InSdep[i]) HD->StartDep=InSdep[i]; if(HD->EndDepEndDep =InEdep[i]; } Dep=InSdep[i]; if(m_Channel.RepCode<1) m_Channel.RepCode=4; int size=RepSize[m_Channel.RepCode]; if(size<1) size=4; INP->InpLen[i]=m_Channel.DimInfo[0].Size/RepSize[m_Channel.RepCode]; INP->InpPos[i+1]=INP->InpPos[i]+INP->InpLen[i]; int j; short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) { unsigned int logtime[100]; Slf_TDT SlfTdt; GetTDTInfo(InCurveNo[i],&SlfTdt); samples=GetTDTAllLogTime(InCurveNo[i],logtime); InData[i]=new char [samples*m_Channel.DimInfo[0].Size+4]; *(int *)InData[i]=samples; } else { samples=(int)((InEdep[i]-InSdep[i])/m_Channel.DimInfo[0].Delta+1.5); if(samples<0) samples=0; InData[i]=new char [(samples+1)*m_Channel.DimInfo[0].Size]; } if(SubAttribute==CURVE_OBJECT) { ReadCurve(InCurveNo[i],Dep,samples,(void *)InData[i]); } else if(SubAttribute==WAVE_OBJECT) { ReadWave(InCurveNo[i],Dep,samples,(void *)InData[i]); } else if(SubAttribute==TDT_OBJECT) { for(j=0;jInpLen[i]=1; INP->InpPos[i+1]=INP->InpPos[i]+INP->InpLen[i]; if(SlfError) { strcpy(SlfError->ErrorStr,buf); SlfError->ErrorNo=-1; } return false; } return true; } void CMemRdWt ::AddOutCurve(Slf_CURVE *mcurve) { AddOutCurve(OUTC->Noo++,mcurve); if(OUTC->Noo!=1) strcat(OUTC->Name," "); strcat(OUTC->Name,mcurve->Name); return; } void CMemRdWt ::AddOutCurve(int i,Slf_CURVE *mCurve) { unsigned char cs[4]={0xcd,0xcd,0xcd,0xcd}; unsigned char cs1[4]={0x0,204,204,204}; unsigned char cs2[4]={204,204,204,204}; float va=*(float*)&cs; float va1=*(float*)&cs1; float va2=*(float*)&cs2; if(mCurve->DepLevel<=-1.0e+3) mCurve->DepLevel=0.125; if(mCurve->StartDepth<=-1.0e+3) mCurve->StartDepth=0; if(mCurve->EndDepth<=-1.0e+3) mCurve->EndDepth=0; if(HD->StartDep<-1.0e+3) HD->StartDep=0; if(HD->StartDep==va||HD->EndDep==va||HD->Rlev==va) { return; } if(HD->StartDep==va1||HD->EndDep==va1||HD->Rlev==va1) { return; } if(HD->StartDep==va2||HD->EndDep==va2||HD->Rlev==va2) { return; } int samples; float Dep; int index=FindObjectIndex(mCurve->Name); short Attribute,SubAttribute; if(index>=0) { short Status=GetObjectStatus(index); if(Status==OBJECT_DELETE) { CString str; str.Format("曲线%s处于删除状态,请清除或恢复该曲线后再作处理",mCurve->Name); AfxMessageBox(str); } } int a=0; if(index>-1) { GetObjectAttribute(index,&Attribute,&SubAttribute); } if(index<0) { a=1; if(OutCurveType) { Slf_FMT fmt; Slf_WAVE wave; Slf_CURVE curve; if(OutCurveType->Type[i]==FMT_OBJECT) { memmove(&fmt,&OutCurveType->addr[i],sizeof(Slf_FMT)); memmove(fmt.Name,mCurve->Name,sizeof(fmt.Name)); OutCurveNo[i]=OpenFMT(&fmt); } else if(OutCurveType->Type[i]==WAVE_OBJECT){ memmove(&wave,&OutCurveType->addr[i],sizeof(Slf_WAVE)); memmove(wave.Name,mCurve->Name,sizeof(wave.Name)); if(wave.StartDepth==-99999) wave.StartDepth=mCurve->StartDepth; if(wave.EndDepth==-99999) wave.EndDepth=mCurve->EndDepth; if(!wave.DepLevel)wave.DepLevel=mCurve->DepLevel; OutCurveNo[i]=OpenWave(&wave); } else if(OutCurveType->Type[i]==CURVE_OBJECT) { if(OutCurveType->addr[i].mCurve.Name[0]!=0) { memmove(&curve,&OutCurveType->addr[i],sizeof(Slf_CURVE)); memmove(curve.Name,mCurve->Name,sizeof(curve.Name)); OutCurveNo[i]=OpenCurve(&curve); } else OutCurveNo[i]=OpenCurve((Slf_CURVE *)mCurve); } else { OutCurveNo[i]=OpenCurve((Slf_CURVE *)mCurve); } } else OutCurveNo[i]=OpenCurve((Slf_CURVE *)mCurve); } else if(SubAttribute==CURVE_OBJECT) OutCurveNo[i]=OpenCurve(mCurve->Name); else if(SubAttribute==FMT_OBJECT) OutCurveNo[i]=OpenFMT(mCurve->Name); else if(SubAttribute==WAVE_OBJECT) OutCurveNo[i]=OpenWave(mCurve->Name); else { OutCurveNo[i]=-1; return; } GetChannelInfo(OutCurveNo[i],&m_Channel); if(m_Channel.DimInfo[0].Delta>100) { OutCurveNo[i]=-1; return; } if(RunSdep!=-999999.0) { OutSdep[i]=RunSdep; OutEdep[i]=RunEdep; } else { OutSdep[i]=HD->StartDep; OutEdep[i]=HD->EndDep; } if(m_Channel.DimInfo[0].Delta==0||m_Channel.DimInfo[0].Delta==va) { return; } if(m_Channel.RepCode>100) return; samples=(int)((OutEdep[i]-OutSdep[i])/m_Channel.DimInfo[0].Delta+1.5); if(samples<0) samples=0; Dep=OutSdep[i]; OUTP->OutLen[i]=m_Channel.DimInfo[0].Size/RepSize[m_Channel.RepCode]; OUTP->OutPos[i+1]=OUTP->OutPos[i]+OUTP->OutLen[i]; OutData[i]=new char[samples*m_Channel.DimInfo[0].Size]; memset(OutData[i],0,samples*m_Channel.DimInfo[0].Size); GetObjectAttribute(OutCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==CURVE_OBJECT) ReadCurve(OutCurveNo[i],Dep,samples,(void *)OutData[i]); else if(SubAttribute==WAVE_OBJECT)ReadWave(OutCurveNo[i],Dep,samples,(void *)OutData[i]); return; } void CMemRdWt ::GetVal(int no,int Len,void *Data,float *yy) { GetChannelInfo(no,&m_Channel); int j; switch(m_Channel.RepCode) { case REPR_INT: for(j=0;jErrorStr,""); SlfError->ErrorNo=0; } static float del=0; int i,j; int samples; int Fs,En; if(InData) { if(Depth!=-99999) { HD->Dep=Depth; } if(No>-1) {Fs=No;En=No+1;} else {Fs=0;En=INC->Noi;} // if(HD->Dep> HD->EndDep) return; for(i=Fs;i-1) { GetChannelInfo(InCurveNo[i],&m_Channel); short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) { for(j=0;j<*(int *)InData[i];j++) { if(HD->Dep==*(float *)&InData[i][4+j*m_Channel.DimInfo[0].Size]) { memmove((char *)&INP->yy[INP->InpPos[i]],&InData[i][4+j*m_Channel.DimInfo[0].Size],m_Channel.DimInfo[0].Size); } } } else { samples=GetSamplePos(HD->Dep,i); //if((int)(HD->StartDep/Rlev)*Rlev==HD->StartDep) samples++; if(samples<0) samples=0; if(HD->Dep>=InSdep[i]-0.5*HD->Rlev&&HD->Dep<=InEdep[i]+0.5*HD->Rlev) { GetVal(InCurveNo[i], INP->InpLen[i], &InData[i][samples*ComputerChannelLength(InCurveNo[i])], &INP->yy[INP->InpPos[i]] ); } else { for(j=0;jInpLen[i];j++) { INP->yy[INP->InpPos[i]+j]=(float)0; } } } } else { for(j=0;jInpLen[i];j++) { INP->yy[INP->InpPos[i]+j]=(float)-99999.0; } } } if(HD->Dep>=HD->Edep) { float edep=HD->Edep; Const(); float depp=(int)((HD->Sdep-HD->StartDep)/Rlev+0.51)*Rlev+HD->StartDep; if(depp>HD->Sdep&&fabs(HD->Dep-depp)Dep=depp; } } HD->Dep=(int)((HD->Dep+Rlev-HD->StartDep)/Rlev+0.51)*Rlev+HD->StartDep; return; } char name[64],*pp; int MaxObjectNumber=GetMaxObjectNumber(); InCurveNo=new int [MaxObjectNumber]; InData =new char*[MaxObjectNumber]; InSdep =new float[MaxObjectNumber]; InEdep =new float[MaxObjectNumber]; for(i=0;iStartDep=99999; HD->EndDep=-99999; INP->InpPos[0]=0; pp=INC->Name; for(i=0;iNoi;i++) { j=0; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[j++]=*pp++; while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[j]='\0'; if(!AddInCurve(i,name));// return; } unsigned char cs[4]={0xcd,0xcd,0xcd,0xcd}; unsigned char cs1[4]={0x0,204,204,204}; unsigned char cs2[4]={204,204,204,204}; float va=*(float*)&cs; float va1=*(float*)&cs1; float va2=*(float*)&cs2; if(HD->StartDep==va1||HD->StartDep==va||HD->StartDep==va2) HD->StartDep=0; if(HD->EndDep==va1||HD->EndDep==va1||HD->EndDep==va2) HD->EndDep=0; float StartDep=HD->StartDep; float EndDep=HD->EndDep; HD->Rlev=Rlev; if(HD->Rlev==va1||HD->Rlev==va||HD->Rlev==va2) { HD->Rlev=0.125; } Const(); if(HD->StartDep==va1||HD->StartDep==va||HD->StartDep==va2) HD->StartDep=0; if(HD->EndDep==va1||HD->EndDep==va1||HD->EndDep==va2) HD->EndDep=0; if(HD->Sdep==va1||HD->Sdep==va||HD->Sdep==va2) HD->Sdep=0; if(HD->Edep==va1||HD->Edep==va1||HD->Edep==va2) HD->Edep=0; if(HD->Stdep==va1||HD->Stdep==va||HD->Stdep==va2) HD->Stdep=0; if(HD->Endep==va1||HD->Endep==va1||HD->Endep==va2) HD->Endep=0; if(HD->Sdep&&HD->Edep==0) { HD->Edep=EndDep; HD->EndDep=EndDep; HD->Endep=EndDep; } HD->Depo=HD->Sdep; HD->Dep=HD->Sdep; if(HD->Endep>HD->EndDep)HD->Endep=HD->EndDep; if(HD->StdepStartDep)HD->Stdep=HD->StartDep; In(HD->Dep,No); HD->Dep=HD->Sdep; if(HD->Endep==0&&HD->Sdep==0&&HD->Edep==0) { if(HD->EndDep) { HD->Stdep=HD->StartDep; HD->Endep=HD->EndDep; HD->Dep=HD->Stdep; HD->Sdep=HD->Stdep; HD->Edep=HD->Endep; } } } void CMemRdWt ::Innn(float Depth,int No) { static float del=0; int i,j; int samples; int Fs,En; if(InData) { if(Depth!=-99999) { HD->Dep=Depth; } if(No>-1) {Fs=No;En=No+1;} else {Fs=0;En=INC->Noi;} // if(HD->Dep> HD->EndDep) return; for(i=Fs;i-1) { GetChannelInfo(InCurveNo[i],&m_Channel); short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) { for(j=0;j<*(int *)InData[i];j++) { if(HD->Dep==*(float *)&InData[i][4+j*m_Channel.DimInfo[0].Size]) { memmove((char *)&INP->yy[INP->InpPos[i]],&InData[i][4+j*m_Channel.DimInfo[0].Size],m_Channel.DimInfo[0].Size); } } } else { if(HD->Dep>=InSdep[i]-0.5*HD->Rlev&&HD->Dep<=InEdep[i]+0.5*HD->Rlev) { int samples1=(int)((HD->Dep-InSdep[i])/m_Channel.DimInfo[0].Delta+0.5); if(samples1<0) samples1=0; float dep1=InSdep[i]+samples1*m_Channel.DimInfo[0].Delta; float *val1=new float[INP->InpLen[i]+1]; GetVal(InCurveNo[i], INP->InpLen[i], &InData[i][samples1*ComputerChannelLength(InCurveNo[i])], val1 ); float *val2=new float[INP->InpLen[i]+1]; int samples2=samples1; if(HD->Dep>dep1){ if(HD->DepDep-InSdep[i])/m_Channel.DimInfo[0].Delta+0.5); else if(HD->DepInpLen[i], &InData[i][samples2*ComputerChannelLength(InCurveNo[i])], val2 ); for (int j0=0;j0InpLen[i];j0++) { if(dep2-dep1==0) INP->yy[INP->InpPos[i]+j0]=val2[j0]; else INP->yy[INP->InpPos[i]+j0]=(val2[j0]-val1[j0])*(dep2-HD->Dep)/(dep2-dep1)+val1[j0]; } delete val1; delete val2; } else { for(j=0;jInpLen[i];j++) { INP->yy[INP->InpPos[i]+j]=(float)0; } } } } else { for(j=0;jInpLen[i];j++) { INP->yy[INP->InpPos[i]+j]=(float)-99999.0; } } } if(HD->Dep>=HD->Edep) { float edep=HD->Edep; Const(); float depp=(int)((HD->Sdep-HD->StartDep)/Rlev+0.51)*Rlev+HD->StartDep; if(depp>HD->Sdep&&fabs(HD->Dep-depp)Dep=depp; } } HD->Dep=(int)((HD->Dep+Rlev-HD->StartDep)/Rlev+0.51)*Rlev+HD->StartDep; return; } char name[64],*pp; int MaxObjectNumber=GetMaxObjectNumber(); InCurveNo=new int [MaxObjectNumber]; InData =new char*[MaxObjectNumber]; InSdep =new float[MaxObjectNumber]; InEdep =new float[MaxObjectNumber]; for(i=0;iStartDep=99999; HD->EndDep=-99999; INP->InpPos[0]=0; pp=INC->Name; for(i=0;iNoi;i++) { j=0; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[j++]=*pp++; while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[j]='\0'; if(!AddInCurve(i,name));// break; } float StartDep=HD->StartDep; float EndDep=HD->EndDep; HD->Sdep=HD->StartDep; HD->Edep=HD->EndDep; HD->Rlev=Rlev; Const(); if(HD->Sdep&&HD->Edep==0) { HD->Edep=EndDep; HD->EndDep=EndDep; HD->Endep=EndDep; } HD->Depo=HD->Sdep; HD->Dep=HD->Sdep; if(HD->Endep>HD->EndDep)HD->Endep=HD->EndDep; if(HD->StdepStartDep)HD->Stdep=HD->StartDep; Innn(HD->Dep,No); HD->Dep=HD->Sdep; } void CMemRdWt ::Inn(float Depth,int No) { static float del=0; int i,j; int samples; int Fs,En; if(InData) { if(Depth!=-99999) { HD->Dep=Depth; } if(No>-1) {Fs=No;En=No+1;} else {Fs=0;En=INC->Noi;} // if(HD->Dep> HD->EndDep) return; for(i=Fs;i-1) { GetChannelInfo(InCurveNo[i],&m_Channel); short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) { for(j=0;j<*(int *)InData[i];j++) { if(HD->Dep==*(float *)&InData[i][4+j*m_Channel.DimInfo[0].Size]) { memmove((char *)&INP->yy[INP->InpPos[i]],&InData[i][4+j*m_Channel.DimInfo[0].Size],m_Channel.DimInfo[0].Size); } } } else { samples=GetSamplePos(HD->Dep,i); if(samples<0) samples=0; if(HD->Dep>=InSdep[i]-0.5*HD->Rlev&&HD->Dep<=InEdep[i]+0.5*HD->Rlev) { int aa=samples*ComputerChannelLength(InCurveNo[i]); float bb=InData[i][samples*ComputerChannelLength(InCurveNo[i])]; GetVal(InCurveNo[i], INP->InpLen[i], &InData[i][samples*ComputerChannelLength(InCurveNo[i])], &INP->yy[INP->InpPos[i]] ); } else { for(j=0;jInpLen[i];j++) { INP->yy[INP->InpPos[i]+j]=(float)0; } } } } else { for(j=0;jInpLen[i];j++) { INP->yy[INP->InpPos[i]+j]=(float)-99999.0; } } } return; } char name[64],*pp; int MaxObjectNumber=GetMaxObjectNumber(); InCurveNo=new int [MaxObjectNumber]; InData =new char*[MaxObjectNumber]; InSdep =new float[MaxObjectNumber]; InEdep =new float[MaxObjectNumber]; for(i=0;iStartDep=99999; HD->EndDep=-99999; INP->InpPos[0]=0; pp=INC->Name; for(i=0;iNoi;i++) { j=0; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[j++]=*pp++; while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[j]='\0'; if(!AddInCurve(i,name));//return; } HD->Sdep=HD->StartDep; HD->Edep=HD->EndDep; HD->Rlev=Rlev; Const(); HD->Depo=HD->Sdep; HD->Dep=HD->Sdep; if(HD->Endep>HD->EndDep)HD->Endep=HD->EndDep; if(HD->StdepStartDep)HD->Stdep=HD->StartDep; Inn(HD->Dep,No); HD->Dep=HD->Sdep; } void CMemRdWt ::CopyCurve( int SourceCurve,float SourceStartDepth,float SourceEndDepth,float DecDepth,int SourceCurveNo,int DecCurveNo) { int i=GetSamplePos(SourceStartDepth,SourceCurveNo); if(i<0) return; int j=GetSamplePos(SourceEndDepth,SourceCurveNo); if(j<0) return; CopyCurve(InData[SourceCurveNo],i,j,DecDepth,DecCurveNo); } void CMemRdWt ::CopyCurve(char *SourceData,int i,int j,float DecDepth,int DecCurveNo) { if(InCurveNo[DecCurveNo]>-1) { Inflag=1; int samples=GetSamplePos(DecDepth,DecCurveNo); GetChannelInfo(InCurveNo[DecCurveNo],&m_Channel); int k=int((InEdep[DecCurveNo]-InSdep[DecCurveNo])/m_Channel.DimInfo[0].Delta+0.5); if(samples<0) { InSdep[DecCurveNo]=DecDepth; char *temp=new char[(-samples+k)*m_Channel.DimInfo[0].Size]; for(int jj=0;jjk) { InEdep[DecCurveNo]=InSdep[DecCurveNo]+(samples+j-i+1)*m_Channel.DimInfo[0].Delta; char *temp=new char [(samples+j-i+1)*m_Channel.DimInfo[0].Size]; memmove(temp,InData[DecCurveNo],samples*m_Channel.DimInfo[0].Size); delete InData[DecCurveNo]; InData[DecCurveNo]=temp; } if(j-i<-1) return; memmove(&InData[DecCurveNo][samples*m_Channel.DimInfo[0].Size],&SourceData[i*m_Channel.DimInfo[0].Size],(j-i+1)*m_Channel.DimInfo[0].Size); } } void CMemRdWt ::CopyCurve(CMemRdWt &SourceData,float SourceStartDepth,float SourceEndDepth,float DecDepth,char* SourceCurve,char* DecCurve) { int SourceCurveNo=SourceData.OpenCurve(SourceCurve); if(SourceCurveNo<0) return; int DecCurveNo=OpenCurve(DecCurve); if(DecCurveNo<0) return; CopyCurve(SourceData,SourceStartDepth,SourceEndDepth,DecDepth,SourceCurveNo,DecCurveNo); } void CMemRdWt ::CopyCurve(CMemRdWt &SourceData,float SourceStartDepth,float SourceEndDepth,float DecDepth,int SourceCurveNo,int DecCurveNo) { // int i=SourceData.GetSamplePos(SourceStartDepth,SourceCurveNo); // if(i<0) return; // int j=SourceData.GetSamplePos(SourceEndDepth,SourceCurveNo); // if(j<0) return; if(!InCurveNo) return; if(InCurveNo[DecCurveNo]>-1) { Slf_CHANNEL sch; SourceData.GetChannelInfo(SourceData.InCurveNo[SourceCurveNo],&sch); GetChannelInfo(InCurveNo[DecCurveNo],&m_Channel); if(m_Channel.NumOfDimension>2) return; if(m_Channel.RepCode!=sch.RepCode|| m_Channel.NumOfDimension!=sch.NumOfDimension ) { AfxMessageBox("数据类型不同,无法粘贴拼接!"); return; } int isneq=0; if( m_Channel.NumOfDimension>1&& (m_Channel.DimInfo[1].Delta!=sch.DimInfo[1].Delta ||m_Channel.DimInfo[1].Size!=sch.DimInfo[1].Size ||m_Channel.DimInfo[1].StartVal!=sch.DimInfo[1].StartVal) ) { // AfxMessageBox("数据类型不同,无法粘贴拼接!"); isneq=1; } Inflag=1; int samples=GetSamplePos(DecDepth,DecCurveNo); int samples1=(DecDepth+SourceEndDepth-SourceStartDepth-InSdep[DecCurveNo])/m_Channel.DimInfo[0].Delta+0.5; int k=int((InEdep[DecCurveNo]-InSdep[DecCurveNo])/m_Channel.DimInfo[0].Delta+0.5); if(samples<0) { InSdep[DecCurveNo]=DecDepth; char *temp=new char[(-samples+k)*m_Channel.DimInfo[0].Size]; for(int jj=0;jjk) { InEdep[DecCurveNo]=InSdep[DecCurveNo]+(samples1)*m_Channel.DimInfo[0].Delta; char *temp=new char [(samples1)*m_Channel.DimInfo[0].Size]; memset(temp,0,(samples1)*m_Channel.DimInfo[0].Size); memmove(temp,InData[DecCurveNo],samples*m_Channel.DimInfo[0].Size); delete InData[DecCurveNo]; InData[DecCurveNo]=temp; } char*buf=new char[m_Channel.DimInfo[0].Size+1]; memset(buf,0,m_Channel.DimInfo[0].Size); float yy=0; samples1=(SourceEndDepth-SourceStartDepth)/m_Channel.DimInfo[0].Delta; for(int pos1=0;pos1SourceData.InEdep[SourceCurveNo]) { memset(buf,0,m_Channel.DimInfo[0].Size); } else if(isneq) { memset(buf,0,m_Channel.DimInfo[0].Size+1); int est=sch.DimInfo[1].StartVal+sch.DimInfo[1].Samples*sch.DimInfo[1].Delta; int mest=m_Channel.DimInfo[1].Samples*m_Channel.DimInfo[1].Delta; int m=0,m0=0; for(int n=m_Channel.DimInfo[1].StartVal;n=sch.DimInfo[1].StartVal&&n=sch.DimInfo[1].Samples) m0=sch.DimInfo[1].Samples-1; if(m>=m_Channel.DimInfo[1].Samples) m=m_Channel.DimInfo[1].Samples-1; yy=GetData(sch.DimInfo[1].RepCode,&SourceData.InData[SourceCurveNo][i*sch.DimInfo[0].Size+m0*RepSize[sch.DimInfo[1].RepCode]],&yy); SetData(m_Channel.DimInfo[1].RepCode,&buf[(m)*RepSize[m_Channel.DimInfo[1].RepCode]],&yy); } } } else memmove(buf,&SourceData.InData[SourceCurveNo][i*sch.DimInfo[0].Size],m_Channel.DimInfo[0].Size); memmove(&InData[DecCurveNo][pos*m_Channel.DimInfo[0].Size],buf,m_Channel.DimInfo[0].Size); } delete []buf; return; } } void CMemRdWt ::InOut(float Depth,int No) { if(!HD) return; static float del=0; int i,samples,Fs,En; Inflag=1; SaveFlag=0; if(InData) { if(Depth!=-99999) HD->Depo=Depth; if(No>-1) {Fs=No;En=No+1;} else {Fs=0;En=INC->Noi;} for(i=Fs;i-1) { short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) continue; if(HD->DepoDepo,i)*mSize; if(samples<0) samples=0; int Len=(GetSamplePos(InEdep[i],i)+1)*mSize; if(Len<0) Len=0; InSdep[i]=HD->Depo; char *temp=new char[mSize-samples+Len]; memmove(&temp[mSize-samples],InData[i],Len); for(int j=0;jDepo>InEdep[i]) { int mSize=ComputerChannelLength(InCurveNo[i]); samples=(GetSamplePos(HD->Depo,i)+1)*mSize; if(samples<0) samples=0; int Len=(GetSamplePos(InEdep[i],i)+1)*mSize; if(Len<0) Len=0; InEdep[i]=HD->Depo; char *temp=new char[samples]; memmove(temp,InData[i],Len); for(int j=Len;jDepo,i); if(samples<0) samples=0; SetVal(InCurveNo[i],INP->InpLen[i],&InData[i][samples*ComputerChannelLength(InCurveNo[i])],&INP->yy[INP->InpPos[i]]); } } if(del<0) { HD->Depo+=del; } float LastDepo=HD->Depo; HD->Depo=int(HD->Depo/Rlev+1.5)*Rlev; del=HD->Depo-LastDepo-Rlev; if(del<0) { HD->Depo-=del; } return; } In(Depth,No); return; } void CMemRdWt ::Out(float Depth,int No) { if(!OUTC) return; if(!HD) return; static float del=0;//c=0; int i,j,Fs,En; int samples; if(Rlev==99999) Rlev=HD->Rlev; if(Rlev<=0) Rlev=0.125; if(Depth!=-99999) HD->Depo=Depth; else { if(HD->Dep==HD->Sdep&&fabs(HD->Depo-HD->Sdep)Depo=HD->Sdep; } } if(HD->Depo==99999.0) return; SaveFlag=0; if(OutData) { if(No>-1) {Fs=No;En=No+1;} else {Fs=0;En=OUTC->Noo;} for(i=Fs;iDepoDepo,i,1)*mSize; int Len=(GetSamplePos(OutEdep[i],i,1)+1)*mSize; if(Len<0) Len=0; OutSdep[i]=HD->Depo; char *temp=new char[-samples+Len+1]; memmove(&temp[-samples],OutData[i],Len); memset(temp,0,-samples); delete OutData[i]; OutData[i]=temp; } if(HD->Depo>OutEdep[i]) { int mSize=ComputerChannelLength(OutCurveNo[i]); samples=GetSamplePos(HD->Depo, i,1); if(samples<0) samples=0; samples++; samples*=mSize; int Len=GetSamplePos(OutEdep[i],i,1); if(Len<0) Len=0; Len++; Len*=mSize; if(Len==samples) samples+=mSize; OutEdep[i]=HD->Depo; char *temp=new char[samples+1*mSize]; memmove(temp,OutData[i],Len); memset(&temp[Len],0,samples-Len); delete OutData[i]; OutData[i]=temp; } if(HD->Depo==OutEdep[i]) { GetChannelInfo(OutCurveNo[i],&m_Channel); } samples=GetSamplePos(HD->Depo,i,1); if(samples<0) samples=0; int ppp=samples*ComputerChannelLength(OutCurveNo[i]); SetVal(OutCurveNo[i],OUTP->OutLen[i],&OutData[i][ppp],&OUTP->yy[OUTP->OutPos[i]]); } //if(del<0) //{ // HD->Depo+=del; //} float LastDepo=HD->Depo; if(HD->Sdep!=99999) { HD->Depo=(int)((HD->Depo+Rlev-HD->StartDep)/Rlev+0.51)*Rlev+HD->StartDep; } else HD->Depo+=Rlev; if(HD->Depo<=LastDepo) { HD->Depo+=Rlev; } return; } Slf_CURVE myCurve; memset(&myCurve,0,sizeof(Slf_CURVE)); int MaxObjectNumber=GetMaxObjectNumber(); OutData= new char *[MaxObjectNumber]; for(i=0;iOutPos[0]=0; pp=OUTC->Name; if(!InData) { HD->StartDep=RunSdep; HD->EndDep=RunEdep; HD->Rlev=Rlev; HD->Sdep=HD->StartDep; HD->Edep=HD->EndDep; } if(OUTC)for(i=0;iNoo;i++) { j=0; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[j++]=*pp++; while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[j]='\0'; if(strlen(name)==0) { AfxMessageBox("输出曲线为空!"); } memmove(myCurve.Name,name,sizeof(myCurve.Name)); strcpy(myCurve.AliasName,""); strcpy(myCurve.Unit,""); strcpy(myCurve.AliasUnit,""); myCurve.RepCode=4; myCurve.CodeLen=4; myCurve.MinValue =99999.0; myCurve.MaxValue =-99999.0; myCurve.StartDepth=HD->StartDep; myCurve.EndDepth =HD->EndDep; if(HD->StartDep>HD->EndDep&&Rlev>0) { HD->EndDep=HD->StartDep; myCurve.EndDepth=HD->StartDep; } myCurve.DepLevel =Rlev; myCurve.DefVal=-9999; strcpy(myCurve.DepthUnit,"m"); AddOutCurve(i,&myCurve); } HD->Depo=HD->Sdep; } void CMemRdWt ::Outt(float Depth,int No) { static float del=0;//c=0; int i,j,Fs,En; int samples; if(Depth!=-99999) HD->Depo=Depth; SaveFlag=0; if(OutData) { if(No>-1) {Fs=No;En=No+1;} else {Fs=0;En=OUTC->Noo;} for(i=Fs;iDepoDepo,i,1)*mSize; if(samples<0) samples=0; int Len=(GetSamplePos(OutEdep[i],i,1)+1)*mSize; if(Len<0) Len=0; OutSdep[i]=HD->Depo; char *temp=new char[-samples+Len+1]; memmove(&temp[-samples],OutData[i],Len); for(int j=0;j<-samples;j++) temp[j]='\0'; delete OutData[i]; OutData[i]=temp; } if(HD->Depo>OutEdep[i]) { int mSize=ComputerChannelLength(OutCurveNo[i]); samples=(GetSamplePos(HD->Depo, i,1))*mSize; if(samples<0) samples=0; int Len=(GetSamplePos(OutEdep[i],i,1))*mSize; if(Len<0) Len=0; if(Len==samples) samples+=mSize; OutEdep[i]=HD->Depo; char *temp=new char[samples+1*mSize+1]; memmove(temp,OutData[i],Len); for(int j=Len;jDepo==OutEdep[i]) { GetChannelInfo(OutCurveNo[i],&m_Channel); } samples=GetSamplePos(HD->Depo,i,1); if(samples<0) samples=0; int ppp=samples*ComputerChannelLength(OutCurveNo[i]); SetVal(OutCurveNo[i],OUTP->OutLen[i],&OutData[i][ppp],&OUTP->yy[OUTP->OutPos[i]]); } return; } Slf_CURVE myCurve; int MaxObjectNumber=GetMaxObjectNumber(); OutData= new char *[MaxObjectNumber]; for(i=0;iOutPos[0]=0; pp=OUTC->Name; if(!InData) { HD->StartDep=RunSdep; HD->EndDep=RunEdep; HD->Rlev=Rlev; HD->Sdep=HD->StartDep; HD->Edep=HD->EndDep; } for(i=0;iNoo;i++) { j=0; while(*pp!=' '&&*pp!=','&&*pp!='\0'&&*pp!='\t') name[j++]=*pp++; while(*pp==' '||*pp=='\t') pp++; if (*pp==',') pp++; while(*pp==' '||*pp=='\t') pp++; name[j]='\0'; memmove(myCurve.Name,name,sizeof(myCurve.Name)); strcpy(myCurve.AliasName,""); strcpy(myCurve.Unit,""); strcpy(myCurve.AliasUnit,""); myCurve.RepCode=4; myCurve.CodeLen=4; myCurve.MinValue =99999.0; myCurve.MaxValue =-99999.0; myCurve.StartDepth=HD->StartDep; myCurve.EndDepth =HD->EndDep; myCurve.DepLevel =Rlev; strcpy(myCurve.DepthUnit,"m"); AddOutCurve(i,&myCurve); } HD->Depo=HD->Sdep; } int CMemRdWt::GetSamplePos(float depth,int no,int inout) { int samples=0; if(inout==1) { if(!OutCurveNo) return -1; if(OutCurveNo[no]<-1) return -1; GetChannelInfo(OutCurveNo[no],&m_Channel); samples=Slf_Int(depth,OutSdep[no],m_Channel.DimInfo[0].Delta);//(depth-OutSdep[no])/m_Channel.DimInfo[0].Delta+0.5; } else { if(!InCurveNo) return -1; if(InCurveNo[no]<0) return -1; GetChannelInfo(InCurveNo[no],&m_Channel); samples=Slf_Int(depth,InSdep[no],m_Channel.DimInfo[0].Delta);//(depth-InSdep[no])/m_Channel.DimInfo[0].Delta+0.5; } return samples; } void CMemRdWt::DeleteInCurve(int i) { char *p,*pp; int j; if(InData) { if(InCurveNo[i]>-1) { short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==CURVE_OBJECT) { CloseCurve(InCurveNo[i]); } else if(SubAttribute==WAVE_OBJECT) { CloseWave(InCurveNo[i]); } delete InData[i]; InData[i]=NULL; } } for(j=i;jNoi;j++) { InData[j]=InData[j+1]; InCurveNo[j]=InCurveNo[j+1]; InSdep[j]=InSdep[j+1]; InEdep[j]=InEdep[j+1]; } pp=INC->Name; for(j=0;jNoi--; InData[INC->Noi] =NULL; InCurveNo[INC->Noi]=-1; } void CMemRdWt::DeleteOutCurve(int i) { int j; char *p,*pp; if(OutData) { if(OutCurveNo[i]>-1) { short Attribute,SubAttribute; GetObjectAttribute(OutCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==CURVE_OBJECT) { CloseCurve(OutCurveNo[i]); } else if(SubAttribute==WAVE_OBJECT) { CloseWave(OutCurveNo[i]); } delete OutData[i]; OutData[i]=NULL; } } for(j=i;jNoo;j++) { OutData[j]=OutData[j+1]; OutCurveNo[j]=OutCurveNo[j+1]; OutSdep[j]=OutSdep[j+1]; OutEdep[j]=OutEdep[j+1]; } pp=OUTC->Name; for(j=0;jNoo--; OutData[OUTC->Noo] =NULL; OutCurveNo[OUTC->Noo]=-1; } void CMemRdWt::CloseData() { if(InData&&InData!=(char **)0xcccccccc) { for(int i=0;iNoi;i++) { if(InCurveNo[i]>-1) { short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==CURVE_OBJECT) { CloseCurve(InCurveNo[i]); } else if(SubAttribute==WAVE_OBJECT) { CloseWave(InCurveNo[i]); } delete []InData[i]; InData[i]=NULL; } } delete []InData; delete []InCurveNo; delete []InSdep; delete []InEdep; InData=NULL; } if(OutData&&OutData!=(char **)0xcccccccc) { for(int i=0;iNoo;i++) { short Attribute,SubAttribute; GetObjectAttribute(OutCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==CURVE_OBJECT) { CloseCurve(OutCurveNo[i]); } else if(SubAttribute==WAVE_OBJECT) { CloseWave(OutCurveNo[i]); } delete []OutData[i]; OutData[i]=NULL; } delete []OutData; delete []OutCurveNo; delete []OutSdep; delete []OutEdep; OutData=NULL; } if(ConstBuffer&&ConstBuffer!=(char *)0xcccccccc) { delete ConstBuffer; } ConstBuffer=NULL; Initialize(); } void CMemRdWt::Close() { if(!SaveFlag)Save(); CloseData(); CLogIO::Close(); } void CMemRdWt::Save() { SaveFlag=1; if(OutData&&!Inflag) { DWORD samples; for(int i=0;iNoo;i++) { samples=GetSamplePos(OutEdep[i],i,1)+1; if(samples<0) samples=0; if(OutCurveNo[i]<0) continue; short Attribute,SubAttribute; GetObjectAttribute(OutCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) continue; if(samples>0) { if(SubAttribute==CURVE_OBJECT) { WriteCurve(OutCurveNo[i],OutSdep[i],samples,(void *)OutData[i]); } else { WriteWave(OutCurveNo[i],OutSdep[i],samples,(void *)OutData[i]); } } } } if(InData&&Inflag) { DWORD samples; for(int i=0;iNoi;i++) { if(InCurveNo[i]>-1) { short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) continue; samples=GetSamplePos(InEdep[i],i)+1; if(samples>0) { if(SubAttribute==CURVE_OBJECT) { WriteCurve(InCurveNo[i],InSdep[i],samples,(void *)InData[i]); } else { WriteWave(InCurveNo[i],InSdep[i],samples,(void *)InData[i]); } } } } } } void CMemRdWt::OutSave(int i) { if(OutData&&!Inflag) { DWORD samples; if(OutCurveNo[i]<0) return; short Attribute,SubAttribute; GetObjectAttribute(OutCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) return; samples=GetSamplePos(OutEdep[i],i,1)+1; if(samples>0) { if(SubAttribute==CURVE_OBJECT) { WriteCurve(OutCurveNo[i],OutSdep[i],samples,(void *)OutData[i]); } else if(SubAttribute==WAVE_OBJECT) { WriteWave(OutCurveNo[i],OutSdep[i],samples,(void *)OutData[i]); } } } } void CMemRdWt::InSave(int i) { if(InData&&Inflag) { DWORD samples; if(InCurveNo[i]>-1) { short Attribute,SubAttribute; GetObjectAttribute(InCurveNo[i],&Attribute,&SubAttribute); if(SubAttribute==TDT_OBJECT) return; samples=GetSamplePos(InEdep[i],i)+1; if(samples>0) { if(SubAttribute==CURVE_OBJECT) { WriteCurve(InCurveNo[i],InSdep[i],samples,(void *)InData[i]); } else if(SubAttribute==WAVE_OBJECT) { WriteWave(InCurveNo[i],InSdep[i],samples,(void *)InData[i]); } } } } } CString CMemRdWt::GetWellName() { CString name; name.Format("%s",m_LogFileName); return name; } void CMemRdWt::GetWellName(char *Name) { strcpy(Name,m_LogFileName); return; }