diff --git a/CallManage/CallManage.h b/CallManage/CallManage.h index 31cff80..862935c 100644 --- a/CallManage/CallManage.h +++ b/CallManage/CallManage.h @@ -119,7 +119,10 @@ signals: QString newFillType, QString newTargetLine, QColor newColor, QString newLithosImage, QString newHeadFill, float vMin, float vMax, QString strOtherScaleType, QColor frontColor, QColor backColor, QString newFillMode, bool bFillNow); //置顶层,并取消其他表格的选中状态 - void sig_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType); + void sig_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType, QString strFormInfoType); + + //修改曲线选择状态 iSelect=0未知,1标准曲线,2主校曲线,3从校曲线 + void sig_ChangeLineStatus(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iSelect); //插件测试 void sig_testPlugin(QString strInfo); diff --git a/logPlus/CurveLine.cpp b/logPlus/CurveLine.cpp new file mode 100644 index 0000000..d8ab3b2 --- /dev/null +++ b/logPlus/CurveLine.cpp @@ -0,0 +1,22 @@ +#include "CurveLine.h" +CurveLine::CurveLine() +{ + m_LeftDepth = -1; + m_RightDepth = -1; +} +void CurveLine::SetLeftDepth(float depth) +{ + m_LeftDepth = depth; +} +float CurveLine::GetLeftDepth() const +{ + return m_LeftDepth; +} +void CurveLine::SetRightDepth(float depth) +{ + m_RightDepth = depth; +} +float CurveLine::GetRightDepth() const +{ + return m_RightDepth; +} diff --git a/logPlus/CurveLine.h b/logPlus/CurveLine.h new file mode 100644 index 0000000..9e47fb2 --- /dev/null +++ b/logPlus/CurveLine.h @@ -0,0 +1,29 @@ +#ifndef CCURVELINE +#define CCURVELINE +class CurveLine +{ + +public: + CurveLine(); + /** + * @brief 设置业务深度 + */ + void SetLeftDepth(float depth); + /** + * @brief 获取业务深度 + */ + float GetLeftDepth() const; + /** + * @brief 设置业务深度 + */ + void SetRightDepth(float depth); + /** + * @brief 获取业务深度 + */ + float GetRightDepth() const; +private: + float m_LeftDepth; + float m_RightDepth; +public:; +}; +#endif diff --git a/logPlus/DepPairs.cpp b/logPlus/DepPairs.cpp new file mode 100644 index 0000000..35961cf --- /dev/null +++ b/logPlus/DepPairs.cpp @@ -0,0 +1,1235 @@ +////////////////////////////////////////////////////////////////// +/// +/// 测录井信息综合平台 +/// +/// 编制:王卫 +/// +/// 版权:中国石化集团石油工程技术研究院 +/// +/// 2010年10月- +/// +// Depth.cpp : implementation file +// +#include "DepPairs.h" +#include "MemRdWt.h" +#include "math.h" +#include "BaseFun.h" +#include "geometryutils.h" +#include +#include "qapplication.h" +#include + +int GetDepPairs(float* curve1,float stdep1,float endep1,float rlev1, + float* curve2,float stdep2,float endep2,float rlev2,float cmins, + float winLength,float stepLength, float searchLength, + float *FirstDep, + float *SecondDep, + float *corc) +{ + DepPairs depPairs(curve1,stdep1,endep1,rlev1, + curve2,stdep2,endep2,rlev2,cmins, + winLength,stepLength,searchLength); + depPairs.FirstDep=FirstDep; + depPairs.SecondDep=SecondDep; + depPairs.corc=corc; + + float stdep=FirstDep[0]; + float endep=SecondDep[0]; + if(stdep==endep){ + stdep=stdep1; + endep=endep1; + + stdep=stdep1; + if(stdep>stdep2) stdep=stdep2; + + endep=endep1; + if(endepstdep2) stdep=stdep2; + + endep=endep1; + if(endep-1&&index1>-1) { + Slf_CURVE curve,curve1; + well.GetCurveInfo(index,&curve); + int count=(curve.EndDepth-curve.StartDepth)/curve.DepLevel+1.5; + float *buffer=new float[count+1]; + well.ReadCurveToFloatBuf(index,curve.StartDepth,count,buffer); + + well1.GetCurveInfo(index1,&curve1); + int count1=(curve1.EndDepth-curve1.StartDepth)/curve1.DepLevel+1.5; + float *buffer1=new float[count1+1]; + well1.ReadCurveToFloatBuf(index1,curve1.StartDepth,count1,buffer1); + int num=getDepPairs(buffer,curve.StartDepth,curve.EndDepth,curve.DepLevel, + buffer1,curve1.StartDepth,curve1.EndDepth,curve1.DepLevel, + FirstDep, + SecondDep + ); + delete buffer; + delete buffer1; + return num; + } + return 0; +} + +int AutoComp(char *Filename,char *Filename1,char *CurveName1,char *CurveName2, + float cmins, + float winLength,float stepLength, float searchLength, + float *FirstDep, + float *SecondDep, + float *corc) +{ + CMemRdWt well; + if(!well.Open(Filename,CMemRdWt::modeRead)) { + return 0; + }; + + CMemRdWt well1; + if(!well1.Open(Filename1,CMemRdWt::modeRead)) { + return 0; + } + + int index=well.OpenCurve(CurveName1); + int index1=well1.OpenCurve(CurveName2); + if(index>-1&&index1>-1) { + Slf_CURVE curve,curve1; + well.GetCurveInfo(index,&curve); + int count=(curve.EndDepth-curve.StartDepth)/curve.DepLevel+1.5; + float *buffer=new float[count+1]; + well.ReadCurveToFloatBuf(index,curve.StartDepth,count,buffer); + + well1.GetCurveInfo(index1,&curve1); + int count1=(curve1.EndDepth-curve1.StartDepth)/curve1.DepLevel+1.5; + float *buffer1=new float[count1+1]; + well1.ReadCurveToFloatBuf(index1,curve1.StartDepth,count1,buffer1); + int num=GetDepPairs(buffer,curve.StartDepth,curve.EndDepth,curve.DepLevel, + buffer1,curve1.StartDepth,curve1.EndDepth,curve1.DepLevel, + cmins, + winLength, + stepLength, + searchLength, + FirstDep, + SecondDep, + corc + ); + delete buffer; + delete buffer1; + return num; + } + return 0; +} +bool AutoCompute(char *Filename,char *Filename1,char *CurveName1,char *CurveName2) +{ + CMemRdWt well; + if(!well.Open(Filename,CMemRdWt::modeRead)) { + return false; + }; + + CMemRdWt well1; + if(!well1.Open(Filename1)) { + return false; + } + + int iIndex=well.OpenTable("OG_RESULT"); + if(iIndex<0) { + return false; + } + + int index=well.OpenCurve(CurveName1); + int index1=well1.OpenCurve(CurveName2); + if(index1>-1&&index1>-1) { + Slf_CURVE curve,curve1; + well.GetCurveInfo(index,&curve); + well1.GetCurveInfo(index1,&curve1); + + int count=(curve.EndDepth-curve.StartDepth)/curve.DepLevel+1.5; + float *buffer=new float[count+1]; + + int count1=(curve1.EndDepth-curve1.StartDepth)/curve1.DepLevel+1.5; + float *buffer1=new float[count1+1]; + + well.ReadCurveToFloatBuf(index,curve.StartDepth,count,buffer); + well1.ReadCurveToFloatBuf(index1,curve1.StartDepth,count1,buffer1); + + float cmins=0.9; + float winLength=4; + float stepLength=0.5; + float searchLength=8; + + float* FirstDep=new float[5000]; + float* SecondDep=new float[5000]; + float* corc=new float[5000]; + + int num=GetDepPairs(buffer,curve.StartDepth,curve.EndDepth,curve.DepLevel, + buffer1,curve1.StartDepth,curve1.EndDepth,curve1.DepLevel, + cmins, + winLength, + stepLength, + searchLength, + FirstDep, + SecondDep, + corc + ); + + delete buffer; + delete buffer1; + char buf[80]; + LAYER_DATA m_Result; + int iIndex1=well1.OpenTable("RESULT"); + int len=well.GetTableRecordLength(iIndex); + if (iIndex1 < 0) + { + iIndex1=well1.Open_Set_Table("RESULT",0,35, + "NO,SDEP,EDEP,ZONE,RESULTNO,THICK,TT,MDEPTH1,MDEPTH2,MDEPTH3,MDEPTH4,MDEPTH5,MDEPTH6,MDEPTH7,MDEPTH8,MDEPTH9,MDEPTH10,OIL,POOROIL,OILWATER,WATEROIL,GAS,POORGAS,GASWATER,WATERGAS,DEST1,DEST2,DEST3,DEST4,DEST5,DEST6,DEST7,DEST8,DEST9,DEST10,SDEP1,EDEP1,SDEP2,EDEP2,SDEP3,EDEP3,SDEP4,EDEP4,SDEP5,EDEP5,SDEP6,EDEP6,SDEP7,EDEP7,SDEP8,EDEP8,SDEP9,EDEP9,SDEP10,EDEP10", + "4,4,4,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,48,48,48,48,48,48,48,48,48,48,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",//字段长度 + "1,4,4,6,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",//字段类型 + "0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");//字段备注 + } + + int iIndex2=well.OpenTable("RESULT"); + if (iIndex2 < 0) + { + iIndex2=well.Open_Set_Table("RESULT",0,35, + "NO,SDEP,EDEP,ZONE,RESULTNO,THICK,TT,MDEPTH1,MDEPTH2,MDEPTH3,MDEPTH4,MDEPTH5,MDEPTH6,MDEPTH7,MDEPTH8,MDEPTH9,MDEPTH10,OIL,POOROIL,OILWATER,WATEROIL,GAS,POORGAS,GASWATER,WATERGAS,DEST1,DEST2,DEST3,DEST4,DEST5,DEST6,DEST7,DEST8,DEST9,DEST10,SDEP1,EDEP1,SDEP2,EDEP2,SDEP3,EDEP3,SDEP4,EDEP4,SDEP5,EDEP5,SDEP6,EDEP6,SDEP7,EDEP7,SDEP8,EDEP8,SDEP9,EDEP9,SDEP10,EDEP10", + "4,4,4,8,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,48,48,48,48,48,48,48,48,48,48,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",//字段长度 + "1,4,4,6,1,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4",//字段类型 + "0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");//字段备注 + } + count=well.GetTableRecordCount(iIndex); + well.SetTableRecordCount(iIndex2,count); + well1.SetTableRecordCount(iIndex1,count); + int j=0; + for(int k=0;kcurve.EndDepth) { + continue; + } + if(m_Result.EndDepthcurve.EndDepth) { + continue; + } + well1.WriteTable(iIndex1,j+1,&buf); + j++; + } + well1.SetTableRecordCount(iIndex1,j); + well.CloseTable(iIndex); + well1.CloseTable(iIndex1); + well.CloseTable(iIndex2); + + char strName[256]; + memset(strName, 0, sizeof (strName)); + strcat(strName,"OG_RESULT1"); + well1.EShiftTableDepth(strName, num,FirstDep,SecondDep); + delete FirstDep; + delete SecondDep; + delete corc; + return true; + } + return false; +} + +//////////////////////////////////////////////////////////////////////////// +// DepPairs对象 +// 显示边框 +// 构造函数 +DepPairs::DepPairs(float* curve1,float stdep1,float endep1,float rlev1, + float* curve2,float stdep2,float endep2,float rlev2,float cmins, + float winLength,float stepLength, float searchLength) +{ + Curve1.stdep=stdep1; + Curve1.endep=endep1; + Curve1.rlev=rlev1; + Curve1.val=curve1; + + Curve2.stdep=stdep2; + Curve2.endep=endep2; + Curve2.rlev=rlev2; + Curve2.val=curve2; + +// num=i; + + DepLevel=rlev1; + if(DepLevel>rlev2) DepLevel=rlev2; + + StartDepth=stdep1; + if(StartDepth>stdep2) StartDepth=stdep2; + + EndDepth=endep1; + if(EndDepthx&&j>left ) j--; + if(i<=j) { + y=datx[i];datx[i]=datx[j];datx[j]=y; + y=daty[i];daty[i]=daty[j];daty[j]=y; + y=datc[i];datc[i]=datc[j];datc[j]=y; + i++;j--; + } + }while(i<=j); + if(leftxmax1) xmax1=val; + val=Curve2.GetValue(tempdep); + if(valxmax2) xmax2=val; + k++; + tempdep=sdeps + k * DepLevel; + } + if(xmin1==xmax1) + { + xmin1=0.; + xmax1=1.; + } + if(xmin2==xmax2) + { + xmin2=0.; + xmax2=1.; + } + return; +} + +float DepPairs::ampl(int n,float *x) +{ + int i; + float xmin,xmax; + xmin=9999.; + xmax=-9999.; + for(i=0;ixmax)xmax=x[i]; + } + return xmax-xmin; +} +float DepPairs::corr(int n,float *x,float *y,int size,int emp) +{ + float sx,sy,xave,yave,sqx,sqy,sxy,dp,dx,dy,c; + float r1,r2,amp1,amp2,ratio; + int i; + sx=0.; + sy=0.; + for(i=0;i=r2)ratio=r1; + if(r1amp2)ratio=amp2; + c=c*ratio; + } + return c; +} +void DepPairs::cor(int iwl,int isl,float *x,float *y,float *c,int size,int emp) +{ + int i,ix=isl,iy; + for(i=0;i<2*isl;i++) { + ix=isl; + iy=i; + c[i]=corr(iwl,&x[ix],&y[iy],size,emp); + } +} +double DepPairs::fun(DPoint &p1, DPoint &p2, DPoint &p3) +{ + double s; + s= (p2.x-p1.x)*(p3.y-p1.y)+(p1.y-p2.y)*(p3.x-p1.x); + return s; +} + +float DepPairs::act(float *x,int n,int way) +{ + int i,i1,i2; + float sum,sq,ave,z,sqd; + sum=0.; + for(i=0;i=n/2&&x[i]>=ave)i1++; + if(i>=n/2&&x[i]=ave)i2++; + if(ii1)z=-z; + if(way==2&&i2<=i1)z=-z; + return z; +} +void DepPairs::actvty(int iwl,int isl,float *dr,int way,float *x,float *c) +{ + int n,n2,i; + n= (int)(*dr / DepLevel); + n2=n/2; + n=2*n2+1; + for(i=0;i= c[1] ) idir1 = idown; + for(i=1;i= c[i+1] )idir2=idown; + if( idir1 == idown && idir2 == iup ) idir1=idir2; + if( idir1 == iup && idir2 == idown ) + { + xdep=depth; + ydep=depth+(i-isl)*DepLevel; + if ( c[i] >= 0.5) { + fprintf(fp_temp,"%8.3f %8.3f %5.3f\n",ydep,xdep,c[i]); +// break; + } + idir1=idir2; + } + } + return 1; +} +int DepPairs::MMax(float ydep,float dep0,int isl,float *c,float cmins) +{ + float xdep; + int ss=-1; + int n=1.5*isl+1; + float maxcor=-99999; + for(int i=0;imaxcor) { + maxcor=c[i]; + ss=i; + } + } + if(ss>-1&&c[ss]>cmins) + { + xdep=dep0+ss*DepLevel; + fprintf(fp_temp,"%8.3f %8.3f %5.3f\n",xdep,ydep,c[ss]); + } + return 1; +} +int DepPairs::signum(float x) +{ + int y; + y=0; + if(x<0.)y=-1; + if(x>0.)y=1; + return y; +} +int DepPairs::optim(int n,float *x1,float *y1,float *c1,float cmins,float elast) +{ + float xmax=999999.; + int xnull=0; + float tfine=0,check,diff=0,fcrif=0,fine=0,fmin=0; + int i,iw,j,ip1,ip2,imin,nd,ids,nd1; + + n=1; + float a,b,d; + int aa=0; + rewind(fp_temp); + while(!feof(fp_temp)) + { + fscanf(fp_temp,"%f%f%f\n",&a,&b,&d); + if(ipar) aa++; + else if(d>=cmins) aa++; + } + if(aa<=0) return -1; + float *x=new float[aa+1000]; + float *y=new float[aa+1000]; + float *c=new float[aa+1000]; + + float *f=new float[aa+1000]; + int *ncs=new int[aa+1000]; + rewind(fp_temp); + while(!feof(fp_temp)) + { + if(fscanf(fp_temp,"%f%f%f\n",&x[n],&y[n],&c[n])!=3) + { + break; + }; + if(ipar) n++; + else if(c[n]>=cmins) n++; + } + fclose(fp_temp); + QString dir=GetLogdataPath(); + dir+="\\temp"; + CreateDir((char *)dir.toStdString().c_str()); + dir+="\\admtemp"; + fp_temp=fopen(dir.toStdString().c_str(),"w+"); + if(ipar) + { + for(ip1=0;ip10;j--) + { + if(x[i]<=x[j]){ + ncs[i]=1; + break; + } + } + if(x[i]-x[i-1]>0&&x[i]-x[i-1]<0.5)ncs[i]=1; + if(!ncs[i]) + { + for(j=i+1;j=x[j]){ + ncs[i]=1; + break; + } + } + } + } + rewind(fp_temp); + j=0; + for(int i=1;i=xmax&&ip1!=n-1) goto l2100; + fmin=xmax; + tfine=0.; + for(iw=0;iw=xmax&&ip2!=0) goto l1900; + if(tfine>fmin) goto l2000; + if(x[ip1]fmin) goto l1900; + fmin=fcrif; + imin=ip2; +l1900:; + } +l2000:; + f[ip1]=fmin; + ncs[ip1]=imin; +l2100:; + } + nd=0; + ids=n-1; + while(1) + { + ids=ncs[ids]; + if(ids==0) break; + f[nd++]=ids; + } + for(i=0;i0&&s2<0||s1>0&&s2>0||s1<0&&s2>0){ + continue; + } + spos[kk]=spos[i]; + kk++; + } + } + if(n<=0) kk=k; + for(int i=0;iisl) len=isl; + for(int m=spos[i];m0){ + spos[i]=ppos-1; + } + } + for(int i=0; i=n1) break; + } + float xmax=999999.,disp1,disp2,disp; + int i,k,j; + if(n<3) { + delete x; + delete y; + delete c; + delete spos; + return -1; + } + i=-1; + float v1,v2,v3; + fclose(fp_temp); + QString dir=GetLogdataPath(); + dir+="\\temp"; + CreateDir((char *)dir.toStdString().c_str()); + dir+="\\admtemp"; + fp_temp=fopen(dir.toStdString().c_str(),"w+"); + while(1) { + i=i+1; + if(i>=n) break; + disp1=y[i]-x[i]; + disp2=y[i+1]-x[i+1]; + if(disp1==disp2) { + i+=2; + for(j=i;j xxx[j5]) + { + tempf5 = xxx[i5]; + xxx[i5] = xxx[j5]; + xxx[j5] = tempf5; + } +} +int DepPairs::GetCompare(int datn,float sdeps,float edeps,float* datx1,float* daty1,float* datc1,float cmins,float xelast) +{ + float *x=new float[datn+10]; + float *y=new float[datn+10]; + float *c=new float[datn+10]; + rewind(fp_temp); + float wl2,xdr2; + int num1,number,numt,i,iwl,isl,iwl2,istep,jsize,ixdr2,idr,idr2; + int n1,kno; + int cccc; + if(wl==0)wl=10.; + if(sl==0)sl=4.; + if(step==0)step=1; + if(dr1==0)dr1=3.; + if(dr2==0)dr2=3.; + if(type!=0 &&sl=datn) break; + } + fclose(fp_temp); + QString dir=GetLogdataPath(); + dir+="\\temp"; + CreateDir((char *)dir.toStdString().c_str()); + dir+="\\admtemp"; + fp_temp=fopen(dir.toStdString().c_str(),"w+"); + + number = maxnum + 2 * isl+2*ixdr2; + + float *datx=new float[number+1]; + float *daty=new float[number+1]; + float *datc=new float[number+1]; + cccc = 0; + for(int j=0;jedeps) datx[k++]=-9999.0; + else datx[k++]=datx1[pos]; + } + else datx[k++]=Curve1.GetValue(dep); + } + k=0; + for(float dep=x[j]-isl*DepLevel/2;depedeps) daty[k++]=-9999.0; + else daty[k++]=daty1[pos]; + } + else daty[k++]=Curve2.GetValue(dep); + } + iwl=(x[j+1]-x[j])/DepLevel; + cor(iwl,isl,datx,daty,datc,size,emp); + MMax(x[j],x[j]-isl*DepLevel/2,isl,datc,cmins); + } + datn=optim(0,datx1,daty1,datc1,cmins,xelast); + delete x; + delete y; + delete c; + return datn; +} +int DepPairs::joincurve(float sdeps,float edeps,float *datx1,float *daty1,float *datc1, + float wl,float sl,float step,float dr1,float dr2, + int type,int size,int way,int emp,int ipar, + float cmins,float xelast) +{ + float depth,depth1,dept,deps; + float wl2,xdr2; + int num1,number,numt,i,iwl,isl,iwl2,istep,jsize,ixdr2,idr,idr2; + int n1,kno; + int cccc; + if(wl==0)wl=10.; + if(sl==0)sl=4.; + if(step==0)step=1; + if(dr1==0)dr1=3.; + if(dr2==0)dr2=3.; + if(type!=0 &&slsetVisible(true); +// ::GetProgressBar()->setRange(sdeps,edeps); +// ::GetProgressBarHint()->setVisible(true); + + char showname[200]; + sprintf(showname,"自动产生深度对比线..."); + int datn=0; + + if(ipar){ + +// ::GetProgressBarHint()->setText("查找层界面...."); + QApplication::processEvents(); + datn=GetDots(n1,sdeps,edeps,DepLevel,datx1,1); +// ::GetProgressBar()->setValue(sdeps+(edeps-sdeps)*0.1); + QApplication::processEvents(); + +// ::GetProgressBarHint()->setText("开始地层对比..."); +// ::GetProgressBar()->setValue(sdeps+(edeps-sdeps)*0.3); + QApplication::processEvents(); + + datn=GetCompare(datn,sdeps,edeps,datx1,daty1,datc1,cmins,xelast); + +// ::GetProgressBar()->setValue(edeps); + QApplication::processEvents(); + } + else{ + float *datx=new float[number+1]; + float *daty=new float[number+1]; + float *datc=new float[number+1]; + cccc = 0; + for (i=0; isetValue(depth); +// ::GetProgressBarHint()->setText(showname); + + QApplication::processEvents(); + + if(depth>edeps-wl2-sl-xdr2) { + break; + } + if ( depth > depth1 ) + { + if ( numt > 0 ) + { + for(i=0;i0)datn=paral(datn,datx1,daty1,datc1,ipar); + } + fclose(fp_temp); +// ::GetProgressBar()->setVisible(false); +// ::GetProgressBarHint()->setVisible(false); + QApplication::processEvents(); + return datn; +} + +int DepPairs::adm(float stem,float etem ,float cmins, + float winLength,float stepLength, float searchLength, + float *datx1,float *daty1,float *datc1 + ) +{ + char str[120]; + int i; + int datn; + cmin = cmins; + datn = joincurve(stem,etem,datx1,daty1,datc1, + winLength,searchLength,stepLength,dr1,dr2,type,size, + way,emp,ipar,cmins,elast); + if ( datn < 0 ) + { + sprintf(str,"%f--%f层段相关性太差,相关系数均小于截止值%f ",stem,etem,cmins); + QMessageBox::warning(nullptr, "提示", str); + } + else { + float *datx,*daty,*datc; + m_nDepPairsNum=0; + datx = new float[datn+100]; + if ( datx == NULL ) + { + QMessageBox::warning(nullptr, "提示", "自动校深:没有足够的内存."); + return m_nDepPairsNum; + } + daty = new float[datn+100]; + if ( daty == NULL ) + { + QMessageBox::warning(nullptr, "提示", "自动校深:没有足够的内存."); + delete datx; + return m_nDepPairsNum; + } + datc = new float[datn+100]; + if ( datc == NULL ) + { + QMessageBox::warning(nullptr, "提示", "自动校深:没有足够的内存."); + delete datx; + delete daty; + return m_nDepPairsNum; + } + QString dir=GetLogdataPath(); + dir+="\\temp"; + CreateDir((char *)dir.toStdString().c_str()); + dir+="\\admtemp"; + fp_temp=fopen(dir.toStdString().c_str(),"rt"); + if(fp_temp==NULL) + { + QMessageBox::warning(nullptr, "提示", "Not create file :admtemp !\n"); + delete [] datx; + delete [] daty; + delete [] datc; + QDir r; + r.remove(dir.toStdString().c_str()); + return -1; + } + i=0; + while(!feof(fp_temp)) + { + fscanf(fp_temp,"%f%f%f",&datx[i],&daty[i],&datc[i]); + i++; + if(i>=datn) break; + } + if(!i) { + QMessageBox::warning(nullptr, "提示", "自动对比文件读写错误!"); + fclose(fp_temp); + delete [] datx; + delete [] daty; + delete [] datc; + QDir r; + r.remove(dir.toStdString().c_str()); + return -1; + } + datn=i; + fclose(fp_temp); + + qs(datx,daty,datc,0,datn-1); + if(last_edep!=stem) + { + float ddep=0; + if(datn) { + ddep=datx[0]-stem; + FirstDep[m_nDepPairsNum]=daty[0]-ddep; + } + else FirstDep[m_nDepPairsNum]=stem; + SecondDep[m_nDepPairsNum]=stem; + corc[m_nDepPairsNum]=1.; + m_nDepPairsNum++; + } + for(i=0;i +extern "C" +{ + int GetDepPairs(float* curve1,float stdep1,float endep1,float rlev1, + float* curve2,float stdep2,float endep2,float rlev2,float cmins, + float winLength,float stepLength, float searchLength, + float *FirstDep, + float *SecondDep, + float *corc); + int getDepPairs(float* curve1,float stdep1,float endep1,float rlev1, + float* curve2,float stdep2,float endep2,float rlev2, + float *FirstDep, + float *SecondDep); + int AutoCompZone(char *Filename,char *Filename1,char *CurveName1,char *CurveName2, + float *FirstDep, + float *SecondDep); + + bool AutoCompute(char *Filename,char *Filename1,char *CurveName1,char *CurveName2); + int AutoComp(char *Filename,char *Filename1,char *CurveName1,char *CurveName2, + float cmins, + float winLength,float stepLength, float searchLength, + float *FirstDep, + float *SecondDep, + float *corc); +} +class CMemRdWt; +// Draw depth-pairs 对象 +struct CCurve{ + float stdep,endep,rlev; + float *val; + float GetValue(float dep) + { + if(dep>=endep) return 0; + if(depsig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 0); + + //标准曲线中,切换为不选择 + m_LeftCurve.m_iTableType=0; + m_LeftCurve.m_strUuid = ""; + m_LeftCurve.m_strWellName = ""; + m_LeftCurve.m_strSlfName=""; + m_LeftCurve.m_strTrackName=""; + m_LeftCurve.m_strLineName=""; + m_LeftCurve.m_strFormInfoType=""; + } + else + { + //修改原来的标准曲线选择状态 iSelect=0未知 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName, 0); + + //修改当前曲线选择状态 iSelect=1标准曲线 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 1); + + //设置标准曲线 + m_LeftCurve = m_SelectTableItem; + } + } + else + { + //当前没有标准曲线 + //修改当前曲线选择状态 iSelect=1标准曲线 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 1); + + //设置标准曲线 + m_LeftCurve = m_SelectTableItem; + } +} + +//设置/取消校正曲线 +void MainWindowCurve::s_Correction() +{ + if(m_SelectTableItem.m_iTableType==0) { + QMessageBox::warning(this, "提示", "请选择要校正的对象!"); + return; + } + + if(m_SelectTableItem.m_iTableType==1) { + QMessageBox::warning(this, "提示", "该功能不支持对井次校正,如果需要井次校正请到数据树上进行!"); + return; + } + + if(m_SelectTableItem.m_iTableType==3 && m_SelectTableItem.m_strFormInfoType=="curveObject") + { + //曲线 + } + else + { + QMessageBox::warning(this, "提示", "该功能只支持曲线! 请选择要校正的曲线!"); + return; + } + + //标准曲线中,去掉本条曲线 + //当前有标准曲线 + if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject") + { + //当前已经选中为标准曲线 + if(m_LeftCurve.m_strSlfName == m_SelectTableItem.m_strSlfName && + m_LeftCurve.m_strWellName == m_SelectTableItem.m_strWellName && + m_LeftCurve.m_strTrackName == m_SelectTableItem.m_strTrackName && + m_LeftCurve.m_strLineName == m_SelectTableItem.m_strLineName) + { + //标准曲线中,切换为不选择 + m_LeftCurve.m_iTableType=0; + m_LeftCurve.m_strUuid = ""; + m_LeftCurve.m_strWellName = ""; + m_LeftCurve.m_strSlfName=""; + m_LeftCurve.m_strTrackName=""; + m_LeftCurve.m_strLineName=""; + m_LeftCurve.m_strFormInfoType=""; + } + } + + //从校曲线中,去掉本条曲线 + for(int i=0; isig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 0); + + //删除从校曲线 + m_ShiftCurves.removeAt(i); + return; + } + } + + //iSelect=0未知,1标准曲线,2主校曲线,3从校曲线 + //当前有主校曲线 + if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject") + { + //当前已经选中为主校曲线 + if(m_RightCurve.m_strSlfName == m_SelectTableItem.m_strSlfName && + m_RightCurve.m_strWellName == m_SelectTableItem.m_strWellName && + m_RightCurve.m_strTrackName == m_SelectTableItem.m_strTrackName && + m_RightCurve.m_strLineName == m_SelectTableItem.m_strLineName) + { + //修改当前曲线选择状态 iSelect=0未知 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 0); + + //主校曲线中,切换为不选择 + m_RightCurve.m_iTableType=0; + m_RightCurve.m_strUuid = ""; + m_RightCurve.m_strWellName = ""; + m_RightCurve.m_strSlfName=""; + m_RightCurve.m_strTrackName=""; + m_RightCurve.m_strLineName=""; + m_RightCurve.m_strFormInfoType=""; + } + else + { + //修改当前曲线选择状态 iSelect=3从校曲线 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 3); + + //设置从校曲线 + m_ShiftCurves.append(m_SelectTableItem); + } + } + else + { + //当前没有主校曲线 + //修改当前曲线选择状态 iSelect=2主校曲线 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_SelectTableItem.m_strSlfName, m_SelectTableItem.m_strWellName, m_SelectTableItem.m_strTrackName, m_SelectTableItem.m_strLineName, 2); + + //设置主校曲线 + m_RightCurve = m_SelectTableItem; + } +} + +// quick sort +void qsort(QVector&datx,int left,int right,int idx) +{ + if(rightGetLeftDepth(); + + do + { + if(idx==0) + { + while(datx[i]->GetLeftDepth()GetLeftDepth()>x && j>left ) j--; + } + else + { + while(datx[i]->GetLeftDepth()>x && iGetLeftDepth()left ) j--; + } + if(i<=j) + { + CurveLine *yy=datx[i]; + datx[i]=datx[j]; + datx[j]=yy; + i++;j--; + } + } while(i<=j); + if(leftsetText(toString(winLength)); + form.addRow(value1, spinbox1); + value1 = QString("步长: "); + QLineEdit *spinbox2 = new QLineEdit(&dialog); + form.addRow(value1, spinbox2); + spinbox2->setText(toString(stepLength)); + value1 = QString("搜索长度: "); + QLineEdit *spinbox3 = new QLineEdit(&dialog); + form.addRow(value1, spinbox3); + spinbox3->setText(toString(searchLength)); + value1 = QString("最小相关系数: "); + QLineEdit *spinbox4 = new QLineEdit(&dialog); + form.addRow(value1, spinbox4); + spinbox4->setText(toString(cmins)); + + value1 = QString("起始深度: "); + QLineEdit *spinbox5 = new QLineEdit(&dialog); + form.addRow(value1, spinbox5); + spinbox5->setText(toString(stdep)); + + value1 = QString("终止深度: "); + QLineEdit *spinbox6 = new QLineEdit(&dialog); + form.addRow(value1, spinbox6); + spinbox6->setText(toString(endep)); + QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, + Qt::Horizontal, &dialog); + form.addWidget(&buttonBox); + + QObject::connect(&buttonBox, SIGNAL(accepted()), &dialog, SLOT(accept())); + QObject::connect(&buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject())); + + dialog.show(); + if (dialog.exec() == QDialog::Accepted) { + // Do something here + } + else return; + winLength=spinbox1->text().toFloat(); + stepLength=spinbox2->text().toFloat(); + searchLength=spinbox3->text().toFloat(); + cmins=spinbox4->text().toFloat(); + stdep=spinbox5->text().toFloat(); + endep=spinbox6->text().toFloat(); + + // + float* FirstDep=new float[5000]; + float* SecondDep=new float[5000]; + float* corc=new float[5000]; + + *FirstDep=stdep; + *SecondDep=endep; + + int num=AutoComp((char *)m_LeftCurve.m_strSlfName.toStdString().c_str(), + (char *)m_RightCurve.m_strSlfName.toStdString().c_str(), + (char *)m_LeftCurve.m_strLineName.toStdString().c_str(), + (char *)m_RightCurve.m_strLineName.toStdString().c_str(), + cmins, + winLength, + stepLength, + searchLength, + FirstDep, + SecondDep, + corc + ); + + for(int i=0;iSetLeftDepth(FirstDep[i]); + pLine->SetRightDepth(SecondDep[i]); + m_mergeLineList.append(pLine); + } + delete FirstDep; + delete SecondDep; + delete corc; + + qsort(m_mergeLineList,0,m_mergeLineList.size()-1,0); + if(num>0) { + CString szBuffer=""; + CString szBuffer1=""; + for(int i=0;iGetLeftDepth(); + float edep=m_mergeLineList[i]->GetRightDepth(); + szBuffer1.Format("%g %g\r\n",sdep,edep); + szBuffer+=szBuffer1; + } + CMemRdWt mem; + if(mem.Open(m_RightCurve.m_strSlfName.toStdString().c_str())) + { + WriteShiftMessage(mem,szBuffer,"Create depths Pairs:","depth_inp"); + } + } +} + +//清除全部曲线设置 +void MainWindowCurve::s_ClearAllSetCurve() +{ + //标准曲线中,去掉本条曲线 + //当前有标准曲线 + if(m_LeftCurve.m_iTableType==3 && m_LeftCurve.m_strFormInfoType=="curveObject") + { + //修改当前曲线选择状态 iSelect=0未知 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_LeftCurve.m_strSlfName, m_LeftCurve.m_strWellName, m_LeftCurve.m_strTrackName, m_LeftCurve.m_strLineName, 0); + + //标准曲线中,切换为不选择 + m_LeftCurve.m_iTableType=0; + m_LeftCurve.m_strUuid = ""; + m_LeftCurve.m_strWellName = ""; + m_LeftCurve.m_strSlfName=""; + m_LeftCurve.m_strTrackName=""; + m_LeftCurve.m_strLineName=""; + m_LeftCurve.m_strFormInfoType=""; + } + + //主校曲线中,去掉本条曲线 + //当前有主校曲线 + if(m_RightCurve.m_iTableType==3 && m_RightCurve.m_strFormInfoType=="curveObject") + { + //修改当前曲线选择状态 iSelect=0未知 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_RightCurve.m_strSlfName, m_RightCurve.m_strWellName, m_RightCurve.m_strTrackName, m_RightCurve.m_strLineName, 0); + + //主校曲线中,切换为不选择 + m_RightCurve.m_iTableType=0; + m_RightCurve.m_strUuid = ""; + m_RightCurve.m_strWellName = ""; + m_RightCurve.m_strSlfName=""; + m_RightCurve.m_strTrackName=""; + m_RightCurve.m_strLineName=""; + m_RightCurve.m_strFormInfoType=""; + } + + //从校曲线中,去掉本条曲线 + for(int i=m_ShiftCurves.size()-1; i>-1; i--) + { + SelectTableItem m_TempCurve = m_ShiftCurves[i]; + //修改当前曲线选择状态 iSelect=0未知 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_TempCurve.m_strSlfName, m_TempCurve.m_strWellName, m_TempCurve.m_strTrackName, m_TempCurve.m_strLineName, 0); + + //删除从校曲线 + m_ShiftCurves.removeAt(i); + } +} + +//清除全部从曲线设置 +void MainWindowCurve::s_ClearSetCurve() +{ + //从校曲线中,去掉本条曲线 + for(int i=m_ShiftCurves.size()-1; i>-1; i--) + { + SelectTableItem m_TempCurve = m_ShiftCurves[i]; + //修改当前曲线选择状态 iSelect=0未知 + emit CallManage::getInstance()->sig_ChangeLineStatus(m_strUuid, m_TempCurve.m_strSlfName, m_TempCurve.m_strWellName, m_TempCurve.m_strTrackName, m_TempCurve.m_strLineName, 0); + + //删除从校曲线 + m_ShiftCurves.removeAt(i); + } +} + QStringList MainWindowCurve::insertCol(int nW) { QStringList sret; @@ -1167,10 +1611,10 @@ void MainWindowCurve::mousePressEvent(QMouseEvent *event) PropertyService()->initWidgetProperty(m_strUuid, m_iScale); //取消所有选中单元格 - emit CallManage::getInstance()->sig_Raise(m_strUuid, "", "", "", "", 1); + emit CallManage::getInstance()->sig_Raise(m_strUuid, "", "", "", "", 1, ""); } -void MainWindowCurve::s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType) +void MainWindowCurve::s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType, QString strFormInfoType) { if(m_strUuid == strUuid) { @@ -1181,7 +1625,7 @@ void MainWindowCurve::s_Raise(QString strUuid, QString strSlfName, QString strWe m_SelectTableItem.m_strSlfName=strSlfName; m_SelectTableItem.m_strTrackName=strTrackName; m_SelectTableItem.m_strLineName=strLineName; - //m_SelectTableItem.m_strType="";//类型:curve, wave + m_SelectTableItem.m_strFormInfoType=strFormInfoType; //类型:curveObject / waveObject / JiegutextObject } else { @@ -1191,6 +1635,7 @@ void MainWindowCurve::s_Raise(QString strUuid, QString strSlfName, QString strWe m_SelectTableItem.m_strSlfName=""; m_SelectTableItem.m_strTrackName=""; m_SelectTableItem.m_strLineName=""; + m_SelectTableItem.m_strFormInfoType=""; } @@ -1216,7 +1661,7 @@ void MainWindowCurve::onItemClicked(QTableWidgetItem* item) PropertyService()->initWellProperty(m_strUuid, strSlfName, strWellName, m_iY1, m_iY2); //取消所有选中单元格 - emit CallManage::getInstance()->sig_Raise(m_strUuid, "", "", "", "", 1); + emit CallManage::getInstance()->sig_Raise(m_strUuid, "", "", "", "", 1, ""); } diff --git a/logPlus/mainwindowcurve.h b/logPlus/mainwindowcurve.h index 4e9c250..78bd1da 100644 --- a/logPlus/mainwindowcurve.h +++ b/logPlus/mainwindowcurve.h @@ -6,6 +6,7 @@ #include "geometryutils.h" #include "formmultiheads.h" #include "qtprojectwidgets.h" +#include "CurveLine.h" #pragma execution_character_set("utf-8") @@ -18,7 +19,7 @@ struct SelectTableItem QString m_strSlfName=""; QString m_strTrackName=""; QString m_strLineName=""; - QString m_strType="";//类型:curve, wave + QString m_strFormInfoType="";//类型:curve, wave }; namespace Ui { @@ -56,7 +57,7 @@ public slots: void onItemClicked(QTableWidgetItem* item); void mousePressEvent(QMouseEvent *event); - void s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType); + void s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType, QString strFormInfoType); public slots: void dragEnterEvent(QDragEnterEvent* event); @@ -75,10 +76,17 @@ public: //当前选中数据表格 SelectTableItem m_SelectTableItem; - FormMultiHeads *m_formMultiHeads; //左侧工程区 + //当前选中,标准曲线 + SelectTableItem m_LeftCurve; + //当前选中,主校曲线 + SelectTableItem m_RightCurve; + //从校曲线 + QList m_ShiftCurves; + //曲线拼接线列表 + QVector m_mergeLineList; + FormMultiHeads *m_formMultiHeads; QDockWidget *m_dock1; - QtProjectWidgets *m_leftWidgets = NULL; //左侧工程区 QLineEdit *spinbox1; @@ -173,6 +181,16 @@ public slots: void MoveShift(QString strSlfName, QString strLineName, float sdep,float edep,float delta); void s_MoveShift(); // 深度分段平移校正 void slotRun(); + //设置/取消标准曲线 + void s_Standard(); + //设置/取消校正曲线 + void s_Correction(); + //自动对比 + void s_autocor(); + //清除全部曲线设置 + void s_ClearAllSetCurve(); + //清除全部从曲线设置 + void s_ClearSetCurve(); // void s_showHeadTable(); //显示/隐藏图头 diff --git a/logPlus/preqtablewidget.cpp b/logPlus/preqtablewidget.cpp index 1f5da19..126ef21 100644 --- a/logPlus/preqtablewidget.cpp +++ b/logPlus/preqtablewidget.cpp @@ -308,7 +308,7 @@ void PreQTableWidget::mouseReleaseEvent(QMouseEvent *event) PropertyService()->initCurveProperty(formInfo, strListOtherLine, listMin, listMax, strListOtherScaleType); //曲线置顶显示,激活可选 - emit CallManage::getInstance()->sig_Raise(m_strUuid, formInfo->m_strSlfName, formInfo->m_strWellName, formInfo->m_strTrackName, formInfo->m_strLineName, 3); + emit CallManage::getInstance()->sig_Raise(m_strUuid, formInfo->m_strSlfName, formInfo->m_strWellName, formInfo->m_strTrackName, formInfo->m_strLineName, 3, formInfo->m_strType); } } } diff --git a/logPlus/qmycustomplot.cpp b/logPlus/qmycustomplot.cpp index afc128f..8560cf0 100644 --- a/logPlus/qmycustomplot.cpp +++ b/logPlus/qmycustomplot.cpp @@ -64,7 +64,7 @@ QMyCustomPlot::QMyCustomPlot(QWidget *parent, QString strSlfName, QString strWel connect(CallManage::getInstance(), SIGNAL(sig_ChangeScaleType(QString, QString, QString, QString, QString, QString)), this, SLOT(s_ChangeScaleType(QString, QString, QString, QString, QString, QString))); //曲线选中,置顶 - connect(CallManage::getInstance(), SIGNAL(sig_Raise(QString, QString, QString, QString, QString, int)), this, SLOT(s_Raise(QString, QString, QString, QString, QString, int))); + connect(CallManage::getInstance(), SIGNAL(sig_Raise(QString, QString, QString, QString, QString, int, QString)), this, SLOT(s_Raise(QString, QString, QString, QString, QString, int, QString))); //颜色 connect(CallManage::getInstance(), SIGNAL(sig_ChangeLineColor(QString, QString, QString, QString, QString, QColor)), this, SLOT(s_ChangeLineColor(QString, QString, QString, QString, QString, QColor))); //线宽 @@ -639,7 +639,7 @@ void QMyCustomPlot::removeSelectedGraphByTitle() // } } -void QMyCustomPlot::s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType) +void QMyCustomPlot::s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType, QString strFormInfoType) { if(m_strUuid == strUuid && m_strSlfName == strSlfName && diff --git a/logPlus/qmycustomplot.h b/logPlus/qmycustomplot.h index 405c6bb..cf01c19 100644 --- a/logPlus/qmycustomplot.h +++ b/logPlus/qmycustomplot.h @@ -114,7 +114,7 @@ public slots: void removeSelectedGraph(); void removeSelectedGraphByTitle(); - void s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType); + void s_Raise(QString strUuid, QString strSlfName, QString strWellName, QString strTrackName, QString strLineName, int iTableType, QString strFormInfoType); //属性 //左刻度 diff --git a/logPlus/qmytablewidget.cpp b/logPlus/qmytablewidget.cpp index 0c1a460..a5dd3d9 100644 --- a/logPlus/qmytablewidget.cpp +++ b/logPlus/qmytablewidget.cpp @@ -147,7 +147,7 @@ void QMyTableWidget::mouseReleaseEvent(QMouseEvent *event) PropertyService()->initTrackProperty(item, iWidth, this, iCurrentCol); // - emit CallManage::getInstance()->sig_Raise(strUuid, strSlfName, strWellName, strTrackName, "", 2); + emit CallManage::getInstance()->sig_Raise(strUuid, strSlfName, strWellName, strTrackName, "", 2, ""); } else { qDebug()<<"QMyTableWidget mouseReleaseEvent, item=null";