2025-11-26 10:21:39 +08:00
|
|
|
|
#pragma warning( push ,0)
|
|
|
|
|
|
#include <cassert>
|
|
|
|
|
|
#include "ObjWell.h"
|
|
|
|
|
|
#include "ObjWelllog.h"
|
|
|
|
|
|
#include "ObjWelllogRound.h"
|
|
|
|
|
|
// #include "ObjWellTrack.h"
|
|
|
|
|
|
// #include "ObjectFolder.h"
|
|
|
|
|
|
// #include "ObjProject.h"
|
|
|
|
|
|
// #include "ViewInfoMetaProperty.h"
|
|
|
|
|
|
#include <QLibrary>
|
|
|
|
|
|
#include <QCoreApplication>
|
|
|
|
|
|
#include <QDir>
|
|
|
|
|
|
// #include "ObjectEvent.h"
|
|
|
|
|
|
#include <QSettings>
|
|
|
|
|
|
#include <QTextCodec>
|
2026-03-27 21:26:43 +08:00
|
|
|
|
#include "geometryutils.h"
|
|
|
|
|
|
#include "TrackPoints.H"
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
|
|
|
|
|
#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<CObjectFolder*>(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;
|
|
|
|
|
|
}
|
2026-03-27 21:26:43 +08:00
|
|
|
|
|
2025-11-26 10:21:39 +08:00
|
|
|
|
// int CObjWell::GetAllWellRound(QList<PaiObject*> &wellroundchildren)
|
|
|
|
|
|
// {
|
2026-03-27 21:26:43 +08:00
|
|
|
|
// this->GetObjectByType(wellroundchildren,GetClassID_WellLogRound());
|
|
|
|
|
|
// return wellroundchildren.size();
|
2025-11-26 10:21:39 +08:00
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// int CObjWell::GetWellRoundCount()
|
|
|
|
|
|
// {
|
|
|
|
|
|
// QList<pai::objectmodel::PaiObject*> wellroundchildren;
|
|
|
|
|
|
// this->GetObjectByType(wellroundchildren,GetClassID_WellLogRound());
|
|
|
|
|
|
// return wellroundchildren.size();
|
|
|
|
|
|
// }
|
|
|
|
|
|
void CObjWell::SetCurrentObjWellRound(CObjWelllogRound*pWellRound)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_pCurrentWelllogRound=pWellRound;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CObjWelllogRound* CObjWell::GetCurrentObjWellRound()
|
|
|
|
|
|
{
|
|
|
|
|
|
/* QList<pai::objectmodel::PaiObject*> 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<PaiObject*> objs;
|
|
|
|
|
|
// if(this->GetParent() != NULL)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// GetParent()->GetChildren(objs);
|
|
|
|
|
|
// }else
|
|
|
|
|
|
// {
|
|
|
|
|
|
// GetProject()->GetWellsFolder(true)->GetPaiObject()->GetChildren(objs);
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// foreach(PaiObject* obj, objs)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// CObjWell* pWell = dynamic_cast<CObjWell*>(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<CObjWell *>( 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 ;i<nXSize;++i )
|
|
|
|
|
|
// {
|
|
|
|
|
|
// double dx = m_vX.m_vProperty[i] - m_vX.m_vProperty[i-1];
|
|
|
|
|
|
// double dy = m_vY.m_vProperty[i] - m_vY.m_vProperty[i-1];
|
|
|
|
|
|
// double dz = m_vZ.m_vProperty[i] - m_vZ.m_vProperty[i-1];
|
|
|
|
|
|
// old_dSum=dSum;
|
|
|
|
|
|
// dSum +=sqrt(dx*dx + dy*dy + dz*dz ) ;
|
|
|
|
|
|
// if(dSum>fMD&&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)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// QList<PaiObject*>childs;
|
|
|
|
|
|
// int rcount=GetAllWellRound(childs);
|
|
|
|
|
|
// int flag=0;
|
|
|
|
|
|
// for(int j=0;j<rcount;j++)//遍历该井下所有井次
|
|
|
|
|
|
// {
|
|
|
|
|
|
// CMemRdWt * logio1 = new CMemRdWt();
|
|
|
|
|
|
// CObjWelllogRound*pRound = dynamic_cast<CObjWelllogRound*>(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;i<count;i++)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// if(val[i]!=-9999&&val[i]!=-99999&&val[i]!=-999.25) {
|
|
|
|
|
|
// if(sdep==-9999) sdep=i*curveinf.DepLevel+curveinf.StartDepth;
|
|
|
|
|
|
// edep=i*curveinf.DepLevel+curveinf.StartDepth;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// logio1->CopyCurve(*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;i<count;i++)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// if(val[i]!=-9999&&val[i]!=-99999&&val[i]!=-999.25) {
|
|
|
|
|
|
// if(sdep==-9999) sdep=i*curveinf.DepLevel+curveinf.StartDepth;
|
|
|
|
|
|
// edep=i*curveinf.DepLevel+curveinf.StartDepth;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// logio1->CopyCurve(*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;i<point;i++) {
|
|
|
|
|
|
// m_vX.m_vProperty[i]=m_vX1.m_vProperty[i];
|
|
|
|
|
|
// m_vY.m_vProperty[i]=m_vY1.m_vProperty[i];
|
|
|
|
|
|
// m_vZ.m_vProperty[i]=m_vZ1.m_vProperty[i];
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// delete logio;
|
|
|
|
|
|
// return true;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// iX=logio->OpenCurve("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;i<point;i++) {
|
|
|
|
|
|
// m_vX.m_vProperty[i]=m_vX1.m_vProperty[i];
|
|
|
|
|
|
// m_vY.m_vProperty[i]=m_vY1.m_vProperty[i];
|
|
|
|
|
|
// m_vZ.m_vProperty[i]=m_vZ1.m_vProperty[i];
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if(m_XYZStartDep==m_XYZEndDep&&m_vX.m_vProperty[0]!=mess.Xcoor) m_vX.m_vProperty[0]=mess.Xcoor;
|
|
|
|
|
|
// if(m_XYZStartDep==m_XYZEndDep&&m_vY.m_vProperty[0]!=mess.Ycoor) m_vY.m_vProperty[0]=mess.Ycoor;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else {
|
|
|
|
|
|
// delete logio;
|
|
|
|
|
|
// return false;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// delete logio;
|
|
|
|
|
|
// return true;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// bool CObjWell::GetDXDYDZByMD(float fMD,double &x,double &y,double &z )
|
|
|
|
|
|
// {
|
|
|
|
|
|
// int nXSize = (int)m_vX.size();
|
|
|
|
|
|
// if(nXSize<1)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// LoadXYZ();
|
|
|
|
|
|
// nXSize = (int)m_vX.size();
|
|
|
|
|
|
// }
|
|
|
|
|
|
// bool bSuccess(false);
|
|
|
|
|
|
// if(nXSize) {
|
|
|
|
|
|
// if(m_StartDep==-9999.0) {//离散数据
|
|
|
|
|
|
// // get m_vMD
|
|
|
|
|
|
// double dSum = 0;
|
|
|
|
|
|
// double old_dSum = 0;
|
|
|
|
|
|
// for( long i = 1 ;i<nXSize;++i )
|
|
|
|
|
|
// {
|
|
|
|
|
|
// double dx = m_vX.m_vProperty[i] - m_vX.m_vProperty[i-1];
|
|
|
|
|
|
// double dy = m_vY.m_vProperty[i] - m_vY.m_vProperty[i-1];
|
|
|
|
|
|
// double dz = m_vZ.m_vProperty[i] - m_vZ.m_vProperty[i-1];
|
|
|
|
|
|
// old_dSum=dSum;
|
|
|
|
|
|
// dSum +=sqrt(dx*dx + dy*dy + dz*dz ) ;
|
|
|
|
|
|
// if(dSum>fMD&&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;
|
|
|
|
|
|
// }
|
2026-03-27 21:26:43 +08:00
|
|
|
|
void CObjWell::SetDepth(CObjWell *pWell)
|
|
|
|
|
|
{
|
2026-04-15 10:16:43 +08:00
|
|
|
|
if(pWell)
|
|
|
|
|
|
{
|
|
|
|
|
|
// int roc=pWell->GetWellRoundCount();
|
|
|
|
|
|
QString path=GetLogdataPath();
|
|
|
|
|
|
path+=pWell->GetPrjname();
|
|
|
|
|
|
path+="/#";
|
|
|
|
|
|
path+=pWell->GetName();
|
|
|
|
|
|
|
|
|
|
|
|
QStringList slffiles;
|
|
|
|
|
|
chakan(path, slffiles, "*.slf");
|
|
|
|
|
|
|
|
|
|
|
|
int roc=slffiles.size();
|
|
|
|
|
|
if(roc)
|
|
|
|
|
|
{
|
|
|
|
|
|
// QList<PaiObject*>childs;
|
|
|
|
|
|
// pWell->GetAllWellRound(childs);
|
|
|
|
|
|
double stardep=99999,enddep=-99999;
|
|
|
|
|
|
float rlev=100;
|
|
|
|
|
|
for(int i=0;i<roc;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
// CObjWelllogRound* pWelllogRound=dynamic_cast<CObjWelllogRound*>(childs[i]);
|
|
|
|
|
|
// if(!pWelllogRound) continue;
|
|
|
|
|
|
CLogIO * logio=new CLogIO();
|
|
|
|
|
|
|
|
|
|
|
|
if(!logio->Open(/*pWelllogRound->GetSlfFileName()*/slffiles.at(i).toStdString().c_str(),CSlfIO::modeReadWrite))
|
|
|
|
|
|
{
|
|
|
|
|
|
delete logio;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
int curveCount=logio->GetObjectCount();
|
|
|
|
|
|
for(int k1=0;k1<curveCount;k1++)
|
|
|
|
|
|
{
|
|
|
|
|
|
char buf[64];
|
|
|
|
|
|
logio->GetObjectName(k1,buf);
|
|
|
|
|
|
int a=logio->OpenCurve(buf);
|
|
|
|
|
|
if(a>-1)
|
|
|
|
|
|
{
|
|
|
|
|
|
Slf_CURVE acurveinfo;
|
|
|
|
|
|
logio->GetCurveInfo(a,&acurveinfo);
|
|
|
|
|
|
if(acurveinfo.StartDepth<stardep) stardep=acurveinfo.StartDepth;
|
|
|
|
|
|
if(acurveinfo.EndDepth>enddep) 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.StartDepth<stardep) stardep=acurveinfo.StartDepth;
|
|
|
|
|
|
if(acurveinfo.EndDepth>enddep) enddep=acurveinfo.EndDepth;
|
|
|
|
|
|
if(rlev>acurveinfo.DepLevel) rlev=acurveinfo.DepLevel;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if(rlev<=0) rlev=0.125;
|
|
|
|
|
|
delete logio;
|
|
|
|
|
|
}
|
|
|
|
|
|
pWell->SetDepth(stardep,enddep,rlev);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-03-27 21:26:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
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;
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
2026-03-27 21:26:43 +08:00
|
|
|
|
CObjWelllogRound* pWelllogRound;
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-27 21:26:43 +08:00
|
|
|
|
CMemRdWt * logio=new CMemRdWt();
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
2026-03-27 21:26:43 +08:00
|
|
|
|
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";
|
|
|
|
|
|
}
|
2026-04-19 23:49:56 +08:00
|
|
|
|
else slf=path+"/"+QString::fromLocal8Bit(mssage.WellName)+".well";
|
2026-03-27 21:26:43 +08:00
|
|
|
|
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();
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
2026-03-27 21:26:43 +08:00
|
|
|
|
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;
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
2026-03-27 21:26:43 +08:00
|
|
|
|
mWellHead.z=mWellHead.earthEle+mWellHead.dEle-TVD;
|
|
|
|
|
|
mWellHead.dxe=X0;
|
|
|
|
|
|
mWellHead.dyn=Y0;
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
2026-03-27 21:26:43 +08:00
|
|
|
|
// if(mWellHead.tvd==0) mWellHead.tvd=TVD;
|
|
|
|
|
|
double ZD=mWellHead.tvd;
|
|
|
|
|
|
if(mWellHead.tvd==0) ZD=TVD;
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
2026-03-27 21:26:43 +08:00
|
|
|
|
//TVD=mWellHead.tvd;
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
2026-03-27 21:26:43 +08:00
|
|
|
|
std::vector<double>vX;
|
|
|
|
|
|
std::vector<double>vY;
|
|
|
|
|
|
std::vector<double>vZ;
|
|
|
|
|
|
std::vector<float>vTVD;
|
|
|
|
|
|
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;i<point-1;i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
nDevi[i]=nDevi[point2-1];
|
|
|
|
|
|
nAzim[i]=nAzim[point2-1];
|
|
|
|
|
|
}
|
|
|
|
|
|
for(int i=0;i<point;i++) {
|
|
|
|
|
|
TrackPoints(nDevi[i],nAzim[i],acurveinfo.DepLevel,XE,YN,ZD,HOFF0,HOAZ0,gtd,AZIM0);
|
|
|
|
|
|
//x0;
|
|
|
|
|
|
//y0; //xy偏移
|
|
|
|
|
|
//tvd; //井口垂直高度
|
|
|
|
|
|
//depth; //测量深度
|
|
|
|
|
|
//Altitude ; //地面海拔
|
|
|
|
|
|
//KB; // 补心高
|
|
|
|
|
|
//azca; // 闭合方位,磁偏角
|
|
|
|
|
|
double z=mWellHead.earthEle-ZD+mWellHead.dEle;
|
|
|
|
|
|
double x=X_COORDINATE+XE;
|
|
|
|
|
|
double y=Y_COORDINATE+YN;//井斜x,y坐标
|
|
|
|
|
|
float tvd=ZD;
|
|
|
|
|
|
vX[i]=x;
|
|
|
|
|
|
vY[i]=y;
|
|
|
|
|
|
vZ[i]=z;
|
|
|
|
|
|
vTVD[i]=tvd;
|
|
|
|
|
|
}
|
|
|
|
|
|
delete nDevi;
|
|
|
|
|
|
delete nAzim;
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
int curveindex=-1;
|
|
|
|
|
|
for(int i=0;i<curveCount;i++) {
|
|
|
|
|
|
if(logio->GetObjectStatus(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;i<count;i++) {
|
|
|
|
|
|
z-=rlev;
|
|
|
|
|
|
ZD+=rlev;
|
|
|
|
|
|
vX[i]=x;
|
|
|
|
|
|
vY[i]=y;
|
|
|
|
|
|
vZ[i]=z;
|
|
|
|
|
|
vTVD[i]=ZD;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
memset(&acurveinfo,0,sizeof(Slf_CURVE));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// if(acurveinfo.DepLevel&&acurveinfo.StartDepth!=acurveinfo.EndDepth)
|
|
|
|
|
|
{
|
|
|
|
|
|
Slf_CURVE xinfo;
|
|
|
|
|
|
memset(&xinfo,0,sizeof(xinfo));
|
|
|
|
|
|
xinfo.DepLevel=acurveinfo.DepLevel;
|
|
|
|
|
|
if(xinfo.DepLevel==0) xinfo.DepLevel=0.125;
|
|
|
|
|
|
xinfo.StartDepth=acurveinfo.StartDepth;
|
|
|
|
|
|
xinfo.EndDepth=acurveinfo.EndDepth;
|
|
|
|
|
|
xinfo.MaxValue=-999999;
|
|
|
|
|
|
xinfo.MinValue=999999;
|
|
|
|
|
|
xinfo.CodeLen=sizeof(double);
|
|
|
|
|
|
xinfo.RepCode=REPR_DOUBLE;
|
|
|
|
|
|
strcpy(xinfo.AliasName,"X");
|
|
|
|
|
|
strcpy(xinfo.Name,"X");
|
|
|
|
|
|
int index=logio->CreateCurve(&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();
|
|
|
|
|
|
}
|
2025-11-26 10:21:39 +08:00
|
|
|
|
|
|
|
|
|
|
// 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<xsize;i++) {
|
|
|
|
|
|
// double z = m_vZ.m_vProperty[i];
|
|
|
|
|
|
// // z=-ConvertY0(-z);
|
|
|
|
|
|
// double x = m_vX.m_vProperty[i];
|
|
|
|
|
|
// double y = m_vY.m_vProperty[i];
|
|
|
|
|
|
|
|
|
|
|
|
// Point3D p(x, y, z);
|
|
|
|
|
|
// Point3D p3 = model.GetProjectPoint(p);
|
|
|
|
|
|
// Point2D p2 = model.ProfilePointToScreen(p3);
|
|
|
|
|
|
// m_vDX.m_vProperty[i]=p2.x;
|
|
|
|
|
|
// m_vDY.m_vProperty[i]=p2.y;
|
|
|
|
|
|
// float x1, x2, y1, y2, angle = 0;
|
|
|
|
|
|
// int i_1=i-1;/*
|
|
|
|
|
|
// if(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.size()) return m_vDX.m_vProperty[i];
|
|
|
|
|
|
else if(m_vDX.size()) return -9999;
|
|
|
|
|
|
else return dep;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float CObjWell::GetDXToDep(float dx)
|
|
|
|
|
|
{
|
|
|
|
|
|
//以下只适用于递增或递减水平位移的井段
|
|
|
|
|
|
|
|
|
|
|
|
if(m_vDX.size() < 1)return m_XYZStartDep;
|
|
|
|
|
|
int s=m_vDX.size();
|
|
|
|
|
|
if(dx > 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.size()-1;j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(dx==m_vDX.m_vProperty[j]||(dx > 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_vDY.size()-1;j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if((dy >= 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 <m_WellHead.earthEle+m_WellHead.dEle -m_vDY.m_vProperty[j]))
|
|
|
|
|
|
{
|
|
|
|
|
|
i = j;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return m_XYZStartDep+i*m_XYZRlev;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float CObjWell::GetDY(float dep)
|
|
|
|
|
|
{
|
|
|
|
|
|
int i=(dep-m_XYZStartDep)/m_XYZRlev;
|
|
|
|
|
|
if(m_vDY.size()&&i>-1&&i<m_vDY.size()) return m_vDY.m_vProperty[i];
|
|
|
|
|
|
else if(m_vDY.size()) return -9999;
|
|
|
|
|
|
else return dep;
|
|
|
|
|
|
}
|
|
|
|
|
|
float CObjWell::GetDZ(float dep)
|
|
|
|
|
|
{
|
|
|
|
|
|
int i=(dep-m_XYZStartDep)/m_XYZRlev;
|
|
|
|
|
|
if(m_vZ.size()&&i>=0&&i<m_vZ.size()){
|
|
|
|
|
|
dep=m_WellHead.earthEle+m_WellHead.dEle-m_vZ.m_vProperty[i];
|
|
|
|
|
|
return dep;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if(m_vZ.size())return -9999;
|
|
|
|
|
|
else return dep;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DOUBLEPROPERTY & CObjWell::GetY()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_vY;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
FLOATPROPERTY & CObjWell::GetAngle()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_vAngle;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DOUBLEPROPERTY & CObjWell::GetZ()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_vZ;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CObjWell::SetX( const DOUBLEPROPERTY *vX )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vX.copy(vX);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CObjWell::SetY( const DOUBLEPROPERTY *vY )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vY.copy(vY);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CObjWell::SetZ( const DOUBLEPROPERTY *vZ )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vZ.copy(vZ);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CObjWell::SetDepth(float sdep,float edep,float rlev)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_StartDep = sdep;
|
|
|
|
|
|
m_EndDep = edep;
|
|
|
|
|
|
m_Rlev = rlev;
|
|
|
|
|
|
}
|
|
|
|
|
|
void CObjWell::SetStartDep(float sdep)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_StartDep = sdep;
|
|
|
|
|
|
}
|
|
|
|
|
|
void CObjWell::SetEndDep(float dep)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_EndDep = dep;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CObjWell::SetRlev( float rlev )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Rlev = rlev;
|
|
|
|
|
|
}
|
|
|
|
|
|
float CObjWell::GetStartDep()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_StartDep;
|
|
|
|
|
|
}
|
|
|
|
|
|
float CObjWell::GetEndDep()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_EndDep;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float CObjWell::GetRlev()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_Rlev;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QString CObjWell::GetWellSymbol()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_strWellImage;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pai::ios::welllog::Well &CObjWell::GetDBWell()
|
|
|
|
|
|
{
|
|
|
|
|
|
return m_DbWell;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
void CObjWell::SetDBWell(pai::ios::welllog::Well &DbWell)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_DbWell=DbWell;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
// void CObjWell::SetBelongID()
|
|
|
|
|
|
// {
|
|
|
|
|
|
// pai::objectmodel::PaiObject* paiProject = this->GetForebear(GetClassID_Project());
|
|
|
|
|
|
// if(paiProject)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// pai::datamodel::CObjProject *currentProject = dynamic_cast<pai::datamodel::CObjProject*>(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<pai::datamodel::CObjWellLog*>(CPaiObjectHelper::GetSubtree(::GetProject(),wellroundPath.append("/").append(templateKey.toString())));
|
|
|
|
|
|
// }
|
|
|
|
|
|
// pai::datamodel::CObjWellLog* CObjWell::GetWellLogByTemplate(const QVariant& templateKey)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// QList<PaiObject*> wellLogsUnderRounds;
|
|
|
|
|
|
// QList<PaiObject*> welllogOrRounds;
|
|
|
|
|
|
// this->GetChildren(welllogOrRounds);
|
|
|
|
|
|
// for(int i= welllogOrRounds.size()-1; i>=0; --i)
|
|
|
|
|
|
// {
|
|
|
|
|
|
|
|
|
|
|
|
// if(welllogOrRounds[i]->GetTypeID() == GetClassID_WellLogRound() )
|
|
|
|
|
|
// {
|
|
|
|
|
|
// CObjWelllogRound* currentround=dynamic_cast<pai::datamodel::CObjWelllogRound*>(welllogOrRounds[i]);
|
|
|
|
|
|
// QString wellroundspath=currentround->GetWellRoundPath();
|
|
|
|
|
|
// CObjWellLog* result=dynamic_cast<CObjWellLog*>(CPaiObjectHelper::GetSubtree(::GetProject(),wellroundspath.append("/").append(templateKey.toString())));
|
|
|
|
|
|
// if(result) return result;
|
|
|
|
|
|
// QList<PaiObject*> welllogsUnderRound;
|
|
|
|
|
|
// welllogOrRounds[i]->GetChildren(welllogsUnderRound);
|
|
|
|
|
|
// wellLogsUnderRounds << welllogsUnderRound;
|
|
|
|
|
|
|
|
|
|
|
|
// welllogOrRounds.removeAt(i);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// welllogOrRounds << wellLogsUnderRounds ;
|
|
|
|
|
|
// foreach(PaiObject* welllog, welllogOrRounds)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// pai::datamodel::CBaseObject* welllogCurve = dynamic_cast<pai::datamodel::CBaseObject* >(welllog);
|
|
|
|
|
|
// if(welllogCurve!= NULL && welllogCurve->GetTemplateKey() == templateKey)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// return dynamic_cast<pai::datamodel::CObjWellLog*>(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<pai::datamodel::CBaseObject* >(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<pai::datamodel::CObjWellLog*>(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
|