#pragma warning( push ,0) #include #include "ObjWell.h" #include "ObjWelllog.h" #include "ObjWelllogRound.h" // #include "ObjWellTrack.h" // #include "ObjectFolder.h" // #include "ObjProject.h" // #include "ViewInfoMetaProperty.h" #include #include #include // #include "ObjectEvent.h" #include #include #pragma warning( pop ) BEGIN_OSGDATAMODEL_NAMESPACE; CObjWell *g_pObjWell(NULL); CObjWell::CObjWell() { m_XYZRlev=0.125; m_strWellImage = "well" + QString::number( qAbs( qrand()%11) ) + ".png"; // SetIconName( "well.png"); // AddChild(new CObjectFolder(GetClassID_SingleMethodFolder()) );// // AddChild(new CObjectFolder(GetClassID_WorkflowFolder()) );// // AddChild(new CObjectFolder(GetClassID_SingleWellMapFolder()) );// m_StartDep=-9999.0,m_EndDep=-9999.0,m_Rlev=0.125; m_XYZStartDep=-9999; m_XYZEndDep=-9999; m_pCurrentWelllogRound=NULL; isFLAG=0; // connect( (const QObject*)( &GetObjectEvent() ),SIGNAL(RefreshWellMessage(QString,QObject*)),this,SLOT(slotWellMessage(QString))); } // void CObjWell::slotWellMessage(QString slffile) // { // QString slf1=slffile; // slf1.replace("\\","/"); // QString slf2=m_WellFileName; // slf2.replace("\\","/"); // int index=slffile.lastIndexOf(".",-1,Qt::CaseInsensitive); // if(index>-1) { // slf1=slf1.left(index); // } // index=slf2.lastIndexOf(".",-1,Qt::CaseInsensitive); // if(index>-1) { // slf2=slf2.left(index); // } // slf2.toUpper(); // slf1.toUpper(); // if(slf1==slf2) { // LoadXYZ(true); // } // } // //根据folderid找到对应的folder,如果没有则创建 // CObjectFolder* CObjWell::GetTragetFolder(QUuid aFolderTypeid) // { // CObjectFolder* target=dynamic_cast(GetChildByType(aFolderTypeid)); // if(target==NULL){ // target=new CObjectFolder(aFolderTypeid); // CBaseObjectImpl::AddChild(target,true); // } // return target; // } //往井次下加入曲线时,根据曲线的类型返回其对应的目录id QUuid CObjWell::GetTragetFolderID(QUuid aLogTypeid) { // if(aLogTypeid==GetClassID_WellLog()) return GetClassID_WellLogFolder(); // else if(aLogTypeid==GetClassID_WellTrajectory()) return GetClassID_WellTrajectoryFolder(); // else if(aLogTypeid==GetClassID_WellLogWavefile()) return GetClassID_WellLogWavefileFolder(); // else if(aLogTypeid==GetClassID_WellLogBIN()) return GetClassID_WellLogBINFolder(); // else if(aLogTypeid==GetClassID_WellLogFMT()) return GetClassID_WellLogFMTFolder(); // else if(aLogTypeid==GetClassID_WellLogINP()) return GetClassID_WellLogINPFolder(); // else if(aLogTypeid==GetClassID_WellLogTABLE()) return GetClassID_WellLogTABLEFolder(); // else if(aLogTypeid==GetClassID_WellLogTDT()) return GetClassID_WellLogTDTFolder(); else return GetClassID_GeneralFolder(); } // bool CObjWell::AddChild(PaiObject* pChild, bool mountNow ) // { // if(!pChild) return false; // if(GetTragetFolderID(pChild->GetTypeID())!=GetClassID_GeneralFolder()) // GetTragetFolder(GetTragetFolderID(pChild->GetTypeID()))->AddChild(pChild,mountNow); // else // CBaseObjectImpl::AddChild(pChild,true); // return true; // } WellHead &CObjWell::GetWellHead() { return m_WellHead; } void CObjWell::SaveWellHead(QString wellfilename) { if(wellfilename.isEmpty()) return; CLogIO * logio=new CLogIO(); if(!logio->Open(wellfilename.toStdString().c_str(),CSlfIO::modeRead)) { if(!logio->Open(wellfilename.toStdString().c_str(),CSlfIO::modeCreate)) { QString aa=wellfilename+"文件打开失败,请检查!"; return; } } Slf_FILE_MESSAGE mssage; logio->GetFileMessage(mssage); mssage.azca=m_WellHead.azca; mssage.Altitude=m_WellHead.earthEle; mssage.Kelly=ConvertDataByString(QString::number(m_WellHead.dEle)); mssage.TVD=m_WellHead.tvd; mssage.Xcoor=m_WellHead.x; mssage.Ycoor=m_WellHead.y; mssage.X0=m_WellHead.dxe; mssage.Y0=m_WellHead.dyn; mssage.Z0=m_WellHead.z; mssage.StartDepth=m_WellHead.depth; logio->SetFileMessage(mssage); if(wellfilename.endsWith(".well",Qt::CaseInsensitive)){ m_DbWell.SetAsl(m_WellHead.earthEle); m_DbWell.SetBsl(m_WellHead.dEle); m_DbWell.SetXCode(m_WellHead.x); m_DbWell.SetYCode(m_WellHead.y); } delete logio; } // int CObjWell::GetAllWellRound(QList &wellroundchildren) // { // this->GetObjectByType(wellroundchildren,GetClassID_WellLogRound()); // return wellroundchildren.size(); // } // int CObjWell::GetWellRoundCount() // { // QList wellroundchildren; // this->GetObjectByType(wellroundchildren,GetClassID_WellLogRound()); // return wellroundchildren.size(); // } void CObjWell::SetCurrentObjWellRound(CObjWelllogRound*pWellRound) { m_pCurrentWelllogRound=pWellRound; } CObjWelllogRound* CObjWell::GetCurrentObjWellRound() { /* QList wellroundchildren; GetObjectByType(wellroundchildren,GetClassID_WellLogRound()); if(!m_pCurrentWelllogRound) { if(wellroundchildren.size()) { m_pCurrentWelllogRound=(CObjWelllogRound*)wellroundchildren[0]; return (CObjWelllogRound*)wellroundchildren[0]; } else return NULL; } else */return m_pCurrentWelllogRound; } CObjWell::~CObjWell() { if(g_pObjWell==this) g_pObjWell=NULL; } QUuid CObjWell::GetTypeID()const { return GetClassID_Well(); } double CObjWell::GetTopWellLogDepth() { return m_StartDep; } // bool CObjWell::isExistsName(QString name) // { // QList objs; // if(this->GetParent() != NULL) // { // GetParent()->GetChildren(objs); // }else // { // GetProject()->GetWellsFolder(true)->GetPaiObject()->GetChildren(objs); // } // foreach(PaiObject* obj, objs) // { // CObjWell* pWell = dynamic_cast(obj); // if(pWell != NULL && pWell != this && pWell->GetName().compare(name,Qt::CaseInsensitive)==0) // { // return true; // } // } // return false; // } // void CObjWell::CopyFrom( CBaseObject *pOSGObjectOther ) // { // CBaseObject::CopyFrom( pOSGObjectOther ); // CObjWell *pWell= dynamic_cast( pOSGObjectOther ); // if( pWell ) // { // m_WellHead=pWell->GetWellHead(); // m_DbWell= pWell->m_DbWell ; // } // } double CObjWell::GetBottomWellLogDepth() { return m_EndDep; } // bool CObjWell::Serialize( CObjectArchive &ar ) // { // m_vX.Serialize(ar); // m_vY.Serialize(ar); // m_vZ.Serialize(ar); // if(ar.IsStoring()) // { // BEGIN_WRITE_OBJECT( ar,1 ); // BEGIN_WRITE_BLOCK( ar, 1); // ar << m_strWellImage; // ar << m_WellFileName; // ar << m_WellCode; // ar << m_StartDep; // ar << m_EndDep; // ar << m_Rlev; // CBaseObjectImpl::Serialize( ar ); // END_WRITE_BLOCK( ar, 1 ); // END_WRITE_OBJECT( ar ); // } // else // { // BEGIN_READ_OBJECT( ar,1 ); // BEGIN_READ_BLOCK( 1 ); // ar >> m_strWellImage; // ar >> m_WellFileName; // ar >> m_WellCode; // ar >> m_StartDep; // ar >> m_EndDep; // ar >> m_Rlev; // CBaseObjectImpl::Serialize( ar ); // END_READ_BLOCK( 1 ); // END_READ_OBJECT( ar ); // } // return true; // } // bool CObjWell::GetXYZByMD(float fMD,double &x,double &y,double &z ) // { // int nXSize = (int)m_vX.size(); // if(nXSize<1) // { // LoadXYZ(); // nXSize = (int)m_vX.size(); // } // x=m_WellHead.x; // y=m_WellHead.y; // z=m_WellHead.z; // if(nXSize<=1) return true; // bool bSuccess(false); // if(nXSize) { // if(m_StartDep==-9999.0) {//离散数据 // // get m_vMD // double dSum = 0; // double old_dSum = 0; // for( long i = 1 ;ifMD&&old_dSum<=fMD) { // x=m_vX.m_vProperty[i]; // y=m_vY.m_vProperty[i]; // z=m_vZ.m_vProperty[i]; // return true; // } // } // return bSuccess; // } // } // int nIndex=(fMD-m_XYZStartDep)/m_XYZRlev; // if(nIndex<0) nIndex=0; // if(nIndex>=nXSize) nIndex=nXSize-1; // if( nIndex < nXSize && nIndex>=0 ) // { // x = m_vX.m_vProperty[nIndex]; // y = m_vY.m_vProperty[nIndex]; // z = m_vZ.m_vProperty[nIndex]; // bSuccess = true; // } // return bSuccess; // } void CObjWell::ClearXYZ() { m_vX.clear(); m_vY.clear(); m_vZ.clear(); } // bool CObjWell::LoadXYZ(bool isreCreateXYZ) // { // if(m_WellFileName.isEmpty()) return false; // CMemRdWt * logio=new CMemRdWt(); // if(!logio->Open(m_WellFileName.toStdString().c_str(),CSlfIO::modeRead)) // { // delete logio; // QString aa=m_WellFileName+"文件打开失败,请检查!"; // return false; // } // Slf_FILE_MESSAGE mess; // logio->GetFileMessage(mess); // QString temp = ::GetConfPath()+"data.ini"; // QSettings settings(temp,QSettings::IniFormat,0); // settings.setIniCodec(QTextCodec::codecForName("UTF-8")); // QStringList serials=settings.value("wellType",0).toStringList(); // int type = serials.indexOf(mess.WellType); // if(type>-1) m_strWellImage = "well" + QString::number(type) + ".png"; // logio->DiscardObject("DEVI"); // logio->DiscardObject("AZIM"); // //if(isreCreateXYZ) // { // QListchilds; // int rcount=GetAllWellRound(childs); // int flag=0; // for(int j=0;j(childs[j]); // if(!pRound) continue; // QString slf = this->GetWellFileName(); // if(!logio1->Open(slf.toStdString().c_str(),CSlfIO::modeRead)) // { // delete logio1; // delete logio; // QString aa=m_WellFileName+"文件打开失败,请检查!"; // continue; // } // if(type<0){ // Slf_FILE_MESSAGE mess1; // logio1->GetFileMessage(mess1); // int type=serials.indexOf(mess1.WellType); // if(type>-1) { // m_strWellImage = "well" + QString::number(type) + ".png"; // strcpy(mess.WellType,mess1.WellType); // logio->SetFileMessage(mess); // } // } // int iAZIM = -1, iDev=-1, ishaveazim=0; // { // int iAZIM1=-1,iDev1=-1; // QStringList azims=GetSimilarCurves("AZIM"); // QString azim; // QString AZIM1; // QString DEVI1; // foreach(QString cname,azims) // { // iAZIM1=logio->OpenCurve(cname.toStdString().c_str()); // if(iAZIM1>-1) { // AZIM1=cname; // break; // } // } // QStringList devis=GetSimilarCurves("DEVI"); // QString dev; // foreach(QString cname,devis) // { // iDev1=logio->OpenCurve(cname.toStdString().c_str()); // if(iDev1>-1) // { // DEVI1/*AZIM1*/ = cname; // break; // } // } // //// // foreach(QString cname, azims) // { // iAZIM = logio1->OpenCurve(cname.toStdString().c_str()); // if(iAZIM>-1) { // azim=cname; // break; // } // } // foreach(QString cname, devis) // { // iDev = logio1->OpenCurve(cname.toStdString().c_str()); // if(iDev>-1) { // dev=cname; // break; // } // } // if(iAZIM>-1){//井次中有方位 // if(iAZIM1<0) //井中没有方位 // logio->CopyFromFile(*logio1,(char *)azim.toStdString().c_str()); // else {//井中有方位 // iAZIM = logio->OpenCurve((char *)azim.toStdString().c_str()); // if(iAZIM<0) { // logio->CopyFromFile(*logio1,(char *)azim.toStdString().c_str()); // iAZIM=logio->OpenCurve((char *)azim.toStdString().c_str()); // } // if(iAZIM<0) { // delete logio1; // delete logio; // return false; // } // Slf_CURVE curveinf; // logio->GetCurveInfo(iAZIM,&curveinf); // int count=(curveinf.EndDepth-curveinf.StartDepth)/curveinf.DepLevel+1.5; // float *val=new float[count+1]; // logio->ReadCurve(iAZIM,curveinf.StartDepth,count,val); // float sdep=curveinf.StartDepth; // float edep=curveinf.EndDepth; // for(int i=0;iCopyCurve(*logio,sdep,edep,sdep,(char *)azim.toStdString().c_str(),(char *)azim.toStdString().c_str()); // delete val; // } // //默认井中没有方位,需要从井次中获取 // //logio->CopyFromFile(*logio1,(char *)azim.toStdString().c_str()); // flag=1; // } // if(iDev>-1){ // if(iDev1<0) // logio->CopyFromFile(*logio1,(char *)dev.toStdString().c_str()); // else { // iDev=logio->OpenCurve((char *)dev.toStdString().c_str()); // if(iDev<0) { // logio->CopyFromFile(*logio1,(char *)dev.toStdString().c_str()); // iDev=logio->OpenCurve((char *)dev.toStdString().c_str()); // } // if(iDev<0) { // delete logio1; // delete logio; // return false; // } // Slf_CURVE curveinf; // logio->GetCurveInfo(iDev,&curveinf); // int count=(curveinf.EndDepth-curveinf.StartDepth)/curveinf.DepLevel+1.5; // float *val=new float[count+1]; // logio->ReadCurve(iDev,curveinf.StartDepth,count,val); // float sdep=curveinf.StartDepth; // float edep=curveinf.EndDepth; // for(int i=0;iCopyCurve(*logio,sdep,edep,sdep,(char *)dev.toStdString().c_str(),(char *)dev.toStdString().c_str()); // delete val; // } // //默认井中没有井斜,需要从井次中获取 // //logio->CopyFromFile(*logio1,(char *)dev.toStdString().c_str()); // flag=1; // } // } // delete logio1; // } // if(flag){ // logio->DiscardObject("X"); // logio->DiscardObject("Y"); // logio->DiscardObject("Z"); // if(ComputeTrajectory(this,m_WellFileName)<1) { // return false; // } // } // } // int iX=logio->OpenCurve("X"); // int iY=-1; // int iZ=-1; // Slf_CURVE acurveinfo; // memset(&acurveinfo,0,sizeof(Slf_CURVE)); // if(iX>-1) logio->GetCurveInfo(iX,&acurveinfo); // if(iX<0||mess.Xcoor==0||mess.Ycoor==0) // { // CMemRdWt * logio1=new CMemRdWt(); // QString slf=this->GetWellFileName(); // if(!logio1->Open(slf.toStdString().c_str(),CSlfIO::modeRead)) // { // delete logio1; // delete logio; // QString aa=m_WellFileName+"文件打开失败,请检查!"; // return false; // } // if(mess.Xcoor==0||mess.Ycoor==0) // { // logio1->GetFileMessage(mess); // logio->SetFileMessage(mess); // logio->DiscardObject(iX); // logio->DiscardObject(iY); // logio->DiscardObject(iZ); // } // delete logio; // delete logio1; // if(ComputeTrajectory(this,m_WellFileName)<1) { // return false; // } // logio=new CMemRdWt(); // logio->Open(m_WellFileName.toStdString().c_str(),CSlfIO::modeRead); // int iAZIM=-1,iDev=-1; // { // QStringList azims=GetSimilarCurves("AZIM"); // QString azim; // foreach(QString cname,azims) // { // iAZIM=logio->OpenCurve(cname.toStdString().c_str()); // if(iAZIM>-1) { // azim=cname; // break; // } // } // QStringList devis=GetSimilarCurves("DEVI"); // QString dev; // foreach(QString cname,devis) // { // iDev=logio->OpenCurve(cname.toStdString().c_str()); // if(iDev>-1) { // dev=cname; // break; // } // } // } // if(iAZIM>-1&&iDev>-1) // { // iX=logio->OpenCurve("X"); // iY=logio->OpenCurve("Y"); // iZ=logio->OpenCurve("Z"); // logio->GetCurveInfo(iX,&acurveinfo); // m_XYZRlev=acurveinfo.DepLevel; // m_XYZStartDep=acurveinfo.StartDepth; // m_XYZEndDep=acurveinfo.EndDepth; // int point=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5; // m_vX.resize(point); // m_vY.resize(point); // m_vZ.resize(point); // if(acurveinfo.RepCode==REPR_DOUBLE) { // logio->ReadCurve(iX,acurveinfo.StartDepth,point,(void *)&m_vX.m_vProperty[0]); // logio->ReadCurve(iY,acurveinfo.StartDepth,point,(void *)&m_vY.m_vProperty[0]); // logio->ReadCurve(iZ,acurveinfo.StartDepth,point,(void *)&m_vZ.m_vProperty[0]); // } // else if(acurveinfo.RepCode==REPR_FLOAT) { // FLOATPROPERTY m_vX1; // FLOATPROPERTY m_vY1; // FLOATPROPERTY m_vZ1; // m_vX1.resize(point); // m_vY1.resize(point); // m_vZ1.resize(point); // logio->ReadCurve(iX,acurveinfo.StartDepth,point,(float *)&m_vX1.m_vProperty[0]); // logio->ReadCurve(iY,acurveinfo.StartDepth,point,(float *)&m_vY1.m_vProperty[0]); // logio->ReadCurve(iZ,acurveinfo.StartDepth,point,(float *)&m_vZ1.m_vProperty[0]); // for(int i=0;iOpenCurve("X"); // iY=logio->OpenCurve("Y"); // iZ=logio->OpenCurve("Z"); // double x=0,y=0; // if(iX>=0&&iY>=0&&iZ>=0) { // logio->GetCurveInfo(iX,&acurveinfo); // if(acurveinfo.DepLevel==0||acurveinfo.DepLevel>=2.226e+008||acurveinfo.StartDepth==acurveinfo.EndDepth&&acurveinfo.DepLevel==acurveinfo.StartDepth) // { // mess.Xcoor=0; // mess.Ycoor=0; // goto next1; // } // m_XYZRlev=acurveinfo.DepLevel; // m_XYZStartDep=acurveinfo.StartDepth; // m_XYZEndDep=acurveinfo.EndDepth; // int point=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5; // if(point<1) point=1; // m_vX.resize(point); // m_vY.resize(point); // m_vZ.resize(point); // if(acurveinfo.RepCode==REPR_DOUBLE) { // logio->ReadCurve(iX,acurveinfo.StartDepth,1,(double *)&m_vX.m_vProperty[0]); // x=m_vX.m_vProperty[0]; // logio->ReadCurve(iY,acurveinfo.StartDepth,1,(double *)&m_vY.m_vProperty[0]); // y=m_vY.m_vProperty[0]; // } // else if(acurveinfo.RepCode==REPR_FLOAT) { // float xx,yy; // logio->ReadCurve(iX,acurveinfo.StartDepth,1,(float *)&xx); // x=xx; // logio->ReadCurve(iY,acurveinfo.StartDepth,1,(float *)&yy); // y=yy; // } // if(x==y&&mess.Xcoor!=0&&mess.Ycoor!=0) { // next1: // logio->DiscardObject(iX); // logio->DiscardObject(iY); // logio->DiscardObject(iZ); // delete logio; // if(ComputeTrajectory(this,m_WellFileName)<1) { // return false; // } // logio=new CMemRdWt(); // logio->Open(m_WellFileName.toStdString().c_str(),CSlfIO::modeRead); // iX=logio->OpenCurve("X"); // iY=logio->OpenCurve("Y"); // iZ=logio->OpenCurve("Z"); // logio->GetCurveInfo(iX,&acurveinfo); // m_XYZRlev=acurveinfo.DepLevel; // m_XYZStartDep=acurveinfo.StartDepth; // m_XYZEndDep=acurveinfo.EndDepth; // } // m_vX.resize(point); // m_vY.resize(point); // m_vZ.resize(point); // if(acurveinfo.RepCode==REPR_DOUBLE) { // logio->ReadCurve(iX,acurveinfo.StartDepth,point,(double *)&m_vX.m_vProperty[0]); // logio->ReadCurve(iY,acurveinfo.StartDepth,point,(double *)&m_vY.m_vProperty[0]); // logio->ReadCurve(iZ,acurveinfo.StartDepth,point,(double *)&m_vZ.m_vProperty[0]); // } // else if(acurveinfo.RepCode==REPR_FLOAT) { // FLOATPROPERTY m_vX1; // FLOATPROPERTY m_vY1; // FLOATPROPERTY m_vZ1; // m_vX1.resize(point); // m_vY1.resize(point); // m_vZ1.resize(point); // logio->ReadCurve(iX,acurveinfo.StartDepth,point,(float *)&m_vX1.m_vProperty[0]); // logio->ReadCurve(iY,acurveinfo.StartDepth,point,(float *)&m_vY1.m_vProperty[0]); // logio->ReadCurve(iZ,acurveinfo.StartDepth,point,(float *)&m_vZ1.m_vProperty[0]); // for(int i=0;ifMD&&old_dSum<=fMD) { // x=m_vX.m_vProperty[i]-m_vX.m_vProperty[0]; // y=m_vY.m_vProperty[i]-m_vY.m_vProperty[0]; // z=m_vZ.m_vProperty[i]-m_vZ.m_vProperty[0]; // return true; // } // } // return bSuccess; // } // } // int nIndex=(fMD-m_XYZStartDep)/m_XYZRlev; // if( nIndex < nXSize && nIndex>=0 ) // { // x = m_vX.m_vProperty[nIndex]-m_vX.m_vProperty[0]; // y = m_vY.m_vProperty[nIndex]-m_vY.m_vProperty[0]; // z = m_vZ.m_vProperty[nIndex]-m_vZ.m_vProperty[0]; // bSuccess = true; // } // return bSuccess; // } // void CObjWell::SetDepth(CObjWell *pWell) // { // if(pWell) // { // int roc=pWell->GetWellRoundCount(); // if(roc) // { // QListchilds; // pWell->GetAllWellRound(childs); // double stardep=99999,enddep=-99999; // float rlev=100; // for(int i=0;i(childs[i]); // if(!pWelllogRound) continue; // CLogIO * logio=new CLogIO(); // if(!logio->Open(pWelllogRound->GetSlfFileName().toStdString().c_str(),CSlfIO::modeReadWrite)) // { // delete logio; // break; // } // int curveCount=logio->GetObjectCount(); // for(int k1=0;k1GetObjectName(k1,buf); // int a=logio->OpenCurve(buf); // if(a>-1) // { // Slf_CURVE acurveinfo; // logio->GetCurveInfo(a,&acurveinfo); // if(acurveinfo.StartDepthenddep) enddep=acurveinfo.EndDepth; // if(rlev>acurveinfo.DepLevel) rlev=acurveinfo.DepLevel; // } // else { // int a=logio->OpenWave(buf); // if(a>-1) // { // Slf_WAVE acurveinfo; // logio->GetWaveInfo(a,&acurveinfo); // if(acurveinfo.StartDepthenddep) enddep=acurveinfo.EndDepth; // if(rlev>acurveinfo.DepLevel) rlev=acurveinfo.DepLevel; // } // } // } // if(rlev<=0) rlev=0.125; // delete logio; // } // pWell->SetDepth(stardep,enddep,rlev); // } // } // } // int CObjWell::ComputeTrajectory(CObjWell *pWell,QString slffilename) // { // pWell->SetDepth(pWell); // QLibrary Methodlib; // QString PeModulePath=QCoreApplication::applicationDirPath() + QDir::separator() +"TrackPoints.dll"; // Methodlib.setFileName(PeModulePath); // Methodlib.load(); // typedef int (* LPFNDLLFUNC1)(double azca,double tvd,double dxe,double dyn,double rlev0,double Gldddep,double hoff); // LPFNDLLFUNC1 initTrackPoints; // typedef int (* LPFNDLLFUNC2)(double nDevi,double nAzim,double rlev,double &XE,double &YN,double &ZD,double &HOFF0,double &HOAZ0,double >D0,double &AZIM0); // LPFNDLLFUNC2 TrackPoints; // QString initfname="initTrackPoints"; // QString funname="TrackPoints"; // initTrackPoints = (LPFNDLLFUNC1)(Methodlib.resolve(initfname.toStdString().c_str()));//strDLLFun.toStdString().c_str()) // TrackPoints = (LPFNDLLFUNC2)(Methodlib.resolve(funname.toStdString().c_str()));//strDLLFun.toStdString().c_str()) // QStringList CurveNames; // int iDev=-1,iAZIM=-1,iX=-1,iY=-1,iZ=-1,iDepth=-1; // Slf_FILE_MESSAGE mssage; // CObjWelllogRound* pWelllogRound; // CMemRdWt * logio=new CMemRdWt(); // if(!logio->Open(slffilename.toStdString().c_str(),CSlfIO::modeReadWrite)) // { // delete logio; // QString aa=slffilename+"文件打开失败,请检查!"; // // AppendConsole(pai::log::PAI_ERROR,aa); // Methodlib.unload(); // return 0; // } // logio->GetFileMessage(mssage); // QString path,wen,slfn; // GetWellNameAndPath(slffilename,wen,path,slfn); // if(slfn.indexOf(".well",0,Qt::CaseInsensitive)==-1) // { // QString slf; // if(strlen(mssage.WellName)==0||mssage.WellName[0]==' ') // { // int len=slffilename.indexOf(".slf",0,Qt::CaseInsensitive); // slf=slffilename.mid(0,len)+".well"; // } // else slf=path+"/"+mssage.WellName+".well"; // CMemRdWt sf(slf.toStdString().c_str(),CSlfIO::modeReadWrite); // Slf_FILE_MESSAGE sm; // sf.GetFileMessage(sm); // if(sm.Xcoor!=mssage.Xcoor) // { // if(sm.Xcoor>1&&(_finite(sm.Xcoor)&&!_isnan(sm.Xcoor))) mssage.Xcoor=sm.Xcoor; // else if(mssage.Xcoor>1&&(_finite(mssage.Xcoor)&&!_isnan(mssage.Xcoor)))sm.Xcoor=mssage.Xcoor; // if(sm.Ycoor>1&&(_finite(sm.Ycoor)&&!_isnan(sm.Ycoor))) mssage.Ycoor=sm.Ycoor; // else if(mssage.Ycoor>1&&(_finite(mssage.Ycoor)&&!_isnan(mssage.Ycoor)))sm.Ycoor=mssage.Ycoor; // if(sm.azca&&(_finite(sm.azca)&&!_isnan(sm.azca))) mssage.azca=sm.azca; // else if(mssage.azca&&(_finite(mssage.azca)&&!_isnan(mssage.azca)))sm.azca=mssage.azca; // if(sm.Altitude&&(_finite(sm.Altitude)&&!_isnan(sm.Altitude))) mssage.Altitude=sm.Altitude; // else if(mssage.Altitude&&(_finite(mssage.Altitude)&&!_isnan(mssage.Altitude)))sm.Altitude=mssage.Altitude; // if(sm.Kelly&&(_finite(sm.Kelly)&&!_isnan(sm.Kelly))) mssage.Kelly=sm.Kelly; // else if(mssage.Kelly&&(_finite(mssage.Kelly)&&!_isnan(mssage.Kelly)))sm.Kelly=mssage.Kelly; // if(sm.TVD&&(_finite(sm.TVD)&&!_isnan(sm.TVD))) mssage.TVD=sm.TVD; // else if(mssage.TVD&&(_finite(mssage.TVD)&&!_isnan(mssage.TVD)))sm.TVD=mssage.TVD; // if(sm.X0&&(_finite(sm.X0)&&!_isnan(sm.X0))) mssage.X0=sm.X0; // else if(mssage.X0&&(_finite(mssage.X0)&&!_isnan(mssage.X0)))sm.X0=mssage.X0; // if(sm.Y0&&(_finite(sm.Y0)&&!_isnan(sm.Y0))) mssage.Y0=sm.Y0; // else if(mssage.Y0&&(_finite(mssage.Y0)&&!_isnan(mssage.Y0)))sm.Y0=mssage.Y0; // sf.SetFileMessage(sm); // logio->SetFileMessage(mssage); // } // } // int curveCount=logio->GetObjectCount(); // //说明从项目或者井节点发起attachSLF,需要读取slf获得井名和井次信息 // QString wellname=""; // QString wellRoundname=""; // QStringList azims=GetSimilarCurves("AZIM"); // foreach(QString cname,azims) // { // iAZIM=logio->OpenCurve(cname.toStdString().c_str()); // if(iAZIM>-1) break; // } // QStringList devis=GetSimilarCurves("DEVI"); // foreach(QString cname,devis) // { // iDev=logio->OpenCurve(cname.toStdString().c_str()); // if(iDev>-1) break; // } // Slf_CURVE acurveinfo; // memset(&acurveinfo,0,sizeof(Slf_CURVE)); // float AZCA=mssage.azca,TVD=mssage.TVD,X0=mssage.X0,Y0=mssage.Y0; // double XE=X0,YN=Y0; // float Altitude=mssage.Altitude; // float X_COORDINATE=mssage.Xcoor; // float Y_COORDINATE=mssage.Ycoor;//井斜x,y坐标 // float KB=ConvertDataByFloat(mssage.Kelly).toFloat(); // double HOFF0=0; // double HOAZ0=0,gtd=0; // double AZIM0=0; // if(iAZIM>-1) logio->GetCurveInfo(iAZIM,&acurveinfo); // WellHead &mWellHead=pWell->GetWellHead(); // mWellHead.x=X_COORDINATE; // mWellHead.y=Y_COORDINATE; // if(KB==-9999) KB=0; // if(KB==-99999) KB=0; // mWellHead.dEle=KB; // mWellHead.earthEle=Altitude; // mWellHead.depth=acurveinfo.StartDepth; // mWellHead.startDepth=acurveinfo.StartDepth; // mWellHead.azca=AZCA; // mWellHead.endDepth=acurveinfo.EndDepth; // if(TVD==0) TVD=mWellHead.startDepth; // mWellHead.tvd=TVD; // mWellHead.z=mWellHead.earthEle+mWellHead.dEle-TVD; // mWellHead.dxe=X0; // mWellHead.dyn=Y0; // // if(mWellHead.tvd==0) mWellHead.tvd=TVD; // double ZD=mWellHead.tvd; // if(mWellHead.tvd==0) ZD=TVD; // //TVD=mWellHead.tvd; // std::vectorvX; // std::vectorvY; // std::vectorvZ; // std::vectorvTVD; // if(iAZIM>=0&&iDev>=0&&acurveinfo.DepLevel) { // initTrackPoints(AZCA,TVD,X0,Y0,acurveinfo.DepLevel,30,0); // int point=(mWellHead.endDepth-mWellHead.startDepth)/acurveinfo.DepLevel+1.5; // float *nDevi=new float[point+1]; // memset(nDevi,0,sizeof(float)*point); // float *nAzim=new float[point+1]; // memset(nAzim,0,sizeof(float)*point); // vX.resize(point); // vY.resize(point); // vZ.resize(point); // vTVD.resize(point); // int point1=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5; // int point2=(acurveinfo.EndDepth-mWellHead.startDepth)/acurveinfo.DepLevel+0.5; // logio->ReadCurve(iAZIM,acurveinfo.StartDepth,point1,nAzim); // logio->ReadCurve(iDev,acurveinfo.StartDepth,point1,nDevi); // for(int i=point2;iGetObjectStatus(i)!=OBJECT_NORMAL) continue; // short curvetype=logio->GetObjectType(i); // if(curvetype==CURVE_OBJECT) { // char* curvename=new char[65]; // curvename[64]='\0'; // char* aliasname=new char[65]; // aliasname[64]='\0'; // logio->GetObjectName(i,curvename,NULL,aliasname); // logio->GetCurveInfo(i,&acurveinfo); // if(acurveinfo.DepLevel==0|| // acurveinfo.DepLevel==0xcdcdcdcd // ||acurveinfo.DepLevel>=2.226e+008|| // acurveinfo.StartDepth==acurveinfo.EndDepth){ // logio->DiscardObject(i); // delete curvename; // delete aliasname; // continue; // } // else { // curveindex=logio->OpenCurve(curvename); // delete curvename; // delete aliasname; // } // break; // } // } // float sdep=TVD,edep=TVD,rlev=0.125; // if(curveindex>-1) { // logio->GetCurveInfo(curveindex,&acurveinfo); // sdep=acurveinfo.StartDepth; // edep=acurveinfo.EndDepth; // rlev=acurveinfo.DepLevel; // ZD=sdep; // double z=mWellHead.earthEle-ZD+mWellHead.dEle; // double x=X_COORDINATE+XE+X0; // double y=Y_COORDINATE+YN+Y0;//井斜x,y坐标 // int count=(edep-sdep)/rlev+1.5; // vX.resize(count); // vY.resize(count); // vZ.resize(count); // vTVD.resize(count); // for(int i=0;iCreateCurve(&xinfo); // if(index>-1&&vX.size()) { // logio->WriteCurve(index,xinfo.StartDepth,vX.size(),(double *)&vX[0]); // logio->CloseCurve(index); // } // strcpy(xinfo.AliasName,"Y"); // strcpy(xinfo.Name,"Y"); // index=logio->CreateCurve(&xinfo); // if(index>-1&&vY.size()) { // logio->WriteCurve(index,xinfo.StartDepth,vY.size(),(double *)&vY[0]); // logio->CloseCurve(index); // } // strcpy(xinfo.AliasName,"Z"); // strcpy(xinfo.Name,"Z"); // index=logio->CreateCurve(&xinfo); // if(index>-1&&vZ.size()) { // logio->WriteCurve(index,xinfo.StartDepth,vZ.size(),(double *)&vZ[0]); // logio->CloseCurve(index); // } // strcpy(xinfo.AliasName,"TVD"); // strcpy(xinfo.Name,"TVD"); // xinfo.CodeLen=sizeof(float); // xinfo.RepCode=REPR_FLOAT; // index=logio->CreateCurve(&xinfo); // if(index>-1&&vTVD.size()) { // logio->WriteCurve(index,xinfo.StartDepth,vTVD.size(),(float *)&vTVD[0]); // logio->CloseCurve(index); // } // } // delete logio; // Methodlib.unload(); // return vTVD.size(); // } // void CObjWell::Compute2DTrajectory(float _ProjAngle,double _HorizBoreXE,double _HorizBoreYN,float _HScale,float _VScale) // { // m_WellHead._ProjAngle=_ProjAngle; // m_WellHead._HorizBoreXE=_HorizBoreXE; // m_WellHead._HorizBoreYN=_HorizBoreYN; // Compute2DTrajectory(_HScale,_VScale); // } // void CObjWell::Compute2DTrajectory(float _HScale,float _VScale) // { // if(!m_vX.size())LoadXYZ(); // Well &well=GetDBWell(); // float bs=m_WellHead.earthEle+m_WellHead.dEle; // int xsize=m_vX.size(); // CGeneralProfileModelData model; // model._HRate=1; // model._VRate=1; // model._HScale=1; // model._VScale=1; // // model.InitRealScaleRate(); // if(!m_WellHead._HorizBoreXE) { // m_WellHead._HorizBoreXE=m_WellHead.x; // m_WellHead._HorizBoreYN=m_WellHead.y; // } // model.InitProfileExtent(m_WellHead); // m_vDX.SetSize(xsize); // m_vDY.SetSize(xsize); // m_vAngle.SetSize(xsize); // if(!xsize) return; // m_vDX.m_vProperty[0]=0; // m_vDY.m_vProperty[0]=0; // m_vAngle.m_vProperty[0]=0; // for(int i=1;i=3) // i_1=i-3;*/ // double Z0 = m_vZ.m_vProperty[i_1]; // // Z0=-ConvertY0(-Z0); // double X0 = m_vX.m_vProperty[i-1]; // double Y0= m_vY.m_vProperty[i_1]; // Point3D P30(X0, Y0, Z0); // Point3D PP3 = model.GetProjectPoint(P30); // Point2D ttp2 = model.ProfilePointToScreen(PP3); // Point2D zP21 = model.ProfilePointToScreenZoom(p3);//计算投影后的直接段的与角度 // Point2D zP20 = model.ProfilePointToScreenZoom(PP3);//计算投影后的直接段的与角度 // float tdevi = 0; // zP21.y=-zP21.y; // zP20.y=-zP20.y; // if (zP21.x == zP20.x) // { // if (zP21.y - zP20.y > 0) // tdevi = 90; // else // tdevi = 270; // } // else // { // tdevi = (float)(atan((zP21.y - zP20.y) / (zP21.x - zP20.x)) * 180 / 3.1415926); // if (zP21.y - zP20.y == 0 && zP21.x - zP20.x < 0) tdevi = 180; // if (tdevi < 0) tdevi += 360; // if (zP21.x - zP20.x < 0 && zP21.y - zP20.y > 0) // { // tdevi = tdevi - 180; // } // else if (zP21.x - zP20.x < 0 && zP21.y - zP20.y < 0) // { // tdevi = tdevi + 180; // } // } // angle = tdevi + 90; // if (angle > 360) angle -= 360; // m_vAngle.m_vProperty[i]=angle; // } // } void CObjWell::SetDX(const FLOATPROPERTY *DX) { m_vDX.copy(DX); } void CObjWell::SetDY(const FLOATPROPERTY *DY) { m_vDY.copy(DY); } void CObjWell::SetAngle(const FLOATPROPERTY *Angle) { m_vAngle.copy(Angle); } FLOATPROPERTY & CObjWell::GetDX() { return m_vDX; } FLOATPROPERTY & CObjWell::GetDY() { return m_vDY; } DOUBLEPROPERTY & CObjWell::GetX() { return m_vX; } float CObjWell::GetDX(float dep) { int i=(dep-m_XYZStartDep)/m_XYZRlev; if(i>0)i-=1; if(m_vDX.size()&&i>-1&&i m_vDX.m_vProperty[s-1])return m_XYZEndDep; if(dx<=m_vDX.m_vProperty[0]) return m_XYZStartDep; float err=0; //int i=binarySearch(m_vDX.m_vProperty,s,dx,err); int i = 0; for(int j = 0;j m_vDX.m_vProperty[j] && dx < m_vDX.m_vProperty[j+1]) || ((dx >= m_vDX.m_vProperty[j+1] && dx < m_vDX.m_vProperty[j]))) { i = j; break; } } return m_XYZStartDep+i*m_XYZRlev; } float CObjWell::GetDYToDep(float dy) { //以下只适用于递增或递减垂深的井段 if(m_vDY.size() < 1)return m_XYZStartDep; int s=m_vDY.size(); if(dy > m_WellHead.earthEle+m_WellHead.dEle-m_vDY.m_vProperty[s-1])return m_XYZEndDep; float err=0; //int i=binarySearch(m_vDY.m_vProperty,s,dy,err); int i = 0; for(int j = 0;j= m_WellHead.earthEle+m_WellHead.dEle-m_vDY.m_vProperty[j] && dy < m_WellHead.earthEle+m_WellHead.dEle-m_vDY.m_vProperty[j+1]) || (dy >=m_WellHead.earthEle+m_WellHead.dEle -m_vDY.m_vProperty[j+1] && dy -1&&i=0&&iGetForebear(GetClassID_Project()); // if(paiProject) // { // pai::datamodel::CObjProject *currentProject = dynamic_cast(paiProject); // if(currentProject) // { // pai::ios::welllog::DataObject* dbProject = currentProject->GetDbObject(); // if(dbProject) // { // m_DbWell.SetDataBelongID(dbProject->GetDataID()); // } // } // } // } // pai::ios::welllog::DataObject * CObjWell::GetDbObject() // { // SetBelongID(); // return &m_DbWell; // } /************************************************************************/ /* @brief 得到本井次下的对应模板值的井曲线 */ /************************************************************************/ // pai::datamodel::CObjWellLog* CObjWell::GetWellLogByTemplate(QString wellroundPath,const QVariant& templateKey) // { // int ghostindex=templateKey.toString().indexOf(OBJ_GHOST_MARK); // if(ghostindex>0) return GetWellLogByTemplate(templateKey); // if(wellroundPath=="") return GetWellLogByTemplate(templateKey); // return dynamic_cast(CPaiObjectHelper::GetSubtree(::GetProject(),wellroundPath.append("/").append(templateKey.toString()))); // } // pai::datamodel::CObjWellLog* CObjWell::GetWellLogByTemplate(const QVariant& templateKey) // { // QList wellLogsUnderRounds; // QList welllogOrRounds; // this->GetChildren(welllogOrRounds); // for(int i= welllogOrRounds.size()-1; i>=0; --i) // { // if(welllogOrRounds[i]->GetTypeID() == GetClassID_WellLogRound() ) // { // CObjWelllogRound* currentround=dynamic_cast(welllogOrRounds[i]); // QString wellroundspath=currentround->GetWellRoundPath(); // CObjWellLog* result=dynamic_cast(CPaiObjectHelper::GetSubtree(::GetProject(),wellroundspath.append("/").append(templateKey.toString()))); // if(result) return result; // QList welllogsUnderRound; // welllogOrRounds[i]->GetChildren(welllogsUnderRound); // wellLogsUnderRounds << welllogsUnderRound; // welllogOrRounds.removeAt(i); // } // } // welllogOrRounds << wellLogsUnderRounds ; // foreach(PaiObject* welllog, welllogOrRounds) // { // pai::datamodel::CBaseObject* welllogCurve = dynamic_cast(welllog); // if(welllogCurve!= NULL && welllogCurve->GetTemplateKey() == templateKey) // { // return dynamic_cast(welllogCurve); // } // } // //没有找到,看看是否存在Ghost // int ghostindex=templateKey.toString().indexOf(OBJ_GHOST_MARK); // if(ghostindex>0){ // QString OriginalCurveName=templateKey.toString().left(ghostindex); // //如果是ghost对象,优先在本节点下找,再到各级井次查找 // CBaseObject* pClonedObj=NULL; // foreach(PaiObject* welllog, welllogOrRounds) // { // pai::datamodel::CBaseObject* origwelllogCurve = dynamic_cast(welllog); // if(origwelllogCurve!= NULL && origwelllogCurve->GetTemplateKey().toString() == OriginalCurveName) // { // pClonedObj=origwelllogCurve->CloneObject(); // break; // } // } // if(pClonedObj){ // this->AddChild(pClonedObj->GetPaiObject(),pai::objectmodel::PaiObject::MountNoTree);//MountNoTree // ::GetProject()->AddIDMap(pClonedObj->GetPaiObject()->GetID(),pClonedObj); // pClonedObj->SetCheckState(Qt::Checked); // pClonedObj->SetGhostName(pClonedObj->GetPaiObject()->GetName()+OBJ_GHOST_MARK+QString::fromStdString(GenTimeStamp())); // return dynamic_cast(pClonedObj); // } // } // return NULL; // } OSGDATAMODEL_EXPORT CObjWell *GetCurrentObjWell() { return g_pObjWell; } OSGDATAMODEL_EXPORT void SetCurrentObjWell( CObjWell *pObjWell) { g_pObjWell = pObjWell; } // BEGIN_REGISTER_OBJECT(CObjWell) // QUuid(GetClassID_Well()) // END_REGISTER_OBJECT( CObjWell ); // CWellViewInfo3DBasemap::CWellViewInfo3DBasemap() // { // SetDrawWellPath( true ); // m_LineProperty.SetLineColor( osg::Vec4f(1,0,0,1) ); // m_LineProperty.SetLineWidth(2); // } // BEGIN_REGISTER_OBJECTVIEWINFO(CWellViewInfo3DBasemap) // sOSGObjectViewInfoKey( GetClassID_Well(),GetWindowTypeID_3D() ), // sOSGObjectViewInfoKey( GetClassID_Well(),GetWindowTypeID_QtBasemap() ), // sOSGObjectViewInfoKey( GetClassID_Well(),GetWindowTypeID_Contour() ) // END_REGISTER_OBJECTVIEWINFO( CWellViewInfo3DBasemap ); END_OSGDATAMODEL_NAMESPACE