logplus/OSGDataModel/src/ObjWellLog.cpp

1883 lines
50 KiB
C++
Raw Normal View History

2025-11-10 16:35:40 +08:00
#pragma warning( push ,0)
#include <cassert>
#include <algorithm>
#include <QDebug>
#include <QCoreApplication>
#include "LogIO.h"
#include "ObjWelllog.h"
// #include "ObjWell.h"
// #include "ObjWelllogRound.h"
// #include "ObjWellTrack.h"
// #include "ObjWellLogTrack.h"
// #include "FamilyAliases.h"
// #include "Family.h"
#include "MemRdWt.h"
#include "BaseFun.h"
// #include "ObjectEvent.h"
#include "ObjectID.h"
#pragma warning( pop )
BEGIN_OSGDATAMODEL_NAMESPACE;
CObjWellLog::CObjWellLog(bool visible)
{
// SetFlagEnable(PaiObject::VisibibleOnTree, visible);
m_fPropertMin = 200;
m_fPropertMax = 100;
m_DepthOffset = 0;
// SetIconName("icon/Log.png");
m_BottomDepth=0.0;
m_TopDepth=0.0;
SetName("AC");
m_ShiftTopDepth=-9999.0;
m_ShiftBottomDepth=-9999.0;
m_ObjectType=0;
m_Rlev=0.125;
m_ChangeNo=0;
m_pObjWell=NULL;
m_strValue[0]=0;
isRun=0;
m_SharedMemory=NULL;
m_Handle=NULL;
// connect( (const QObject*)( &GetObjectEvent() ),SIGNAL(RefreshData(QString,QString,QObject*)),this,SLOT(slotRefreshData(QString ,QString,QObject*)));
// connect( (const QObject*)( &GetObjectEvent() ),SIGNAL(DeAttchData(QString,QString)),this,SLOT(slotDeAttchData(QString ,QString)));
}
CObjWellLog::CObjWellLog()
{
m_fPropertMin = 0;
m_fPropertMax = 100;
m_DepthOffset = 0;
// SetIconName("icon/Log.png");
m_BottomDepth=0.0;
m_TopDepth=0.0;
m_ShiftTopDepth=-9999.0;
m_ShiftBottomDepth=-9999.0;
SetName("AC");
m_ObjectType=0;
m_Rlev=0.125;
m_ChangeNo=0;
m_pObjWell=NULL;
isRun=false;
isLoad=false;
isUsing = false;
m_SharedMemory=NULL;
m_Handle=NULL;
// connect( (const QObject*)( &GetObjectEvent() ),
// SIGNAL(RefreshData(QString,QString,QObject*)),
// this,SLOT(slotRefreshData(QString ,QString,QObject*)));
// connect( (const QObject*)( &GetObjectEvent() ),SIGNAL(DeAttchData(QString,QString)),this,SLOT(slotDeAttchData(QString ,QString)));
}
void CObjWellLog::slotRefreshData(QString slf,QString curname,QObject*re)
{
// if(re==this) {
// return;
// }
// QString slf1=m_SlfFileName;
// slf1.replace("\\","/");
// QString slf2=slf;
// slf2.replace("\\","/");
// slf1.toUpper();
// slf2.toUpper();
// if(slf1==slf2) {
// if(!curname.isEmpty()) {
// if(GetName()==curname&&isRun) {
// // isLoad=false;
// GetValidMDProperty(m_vMD,m_vProperty,-99999,-99999);
// // LoadFromSLF();
// }
// return;
// }
// else {
// if(isRun) {
// // isLoad=false;
// GetValidMDProperty(m_vMD,m_vProperty,-99999,-99999);
// // LoadFromSLF();
// }
// }
// }
}
void CObjWellLog::slotDeAttchData(QString slf,QString curname)
{
QString slf1=m_SlfFileName;
slf1.replace("\\","/");
QString slf2=slf;
slf2.replace("\\","/");
slf1.toUpper();
slf2.toUpper();
if(slf1==slf2) {
if(!curname.isEmpty()) {
if(GetName()==curname&&isRun) {
QString name=GetSlfFileName()+GetName();
if(IsMappingMem(name.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
m_vMD.clear();
m_vProperty.clear();
m_vMDShifting.clear();
}
isLoad=false;
}
}
}
}
CObjWellLogTrack *CObjWellLog::GetWellLogTrack()
{
// PaiObject *pPai=GetPaiObject();
// while(pPai) {
// CObjWellLogTrack *pTWellLogTrack=dynamic_cast<CObjWellLogTrack *>(pPai);
// if(pTWellLogTrack) {
// return pTWellLogTrack;
// }
// pPai=pPai->GetParent();
// }
return NULL;
}
CObjWellTrack *CObjWellLog::GetWellTrack()
{
// PaiObject *pPai=GetPaiObject();
// while(pPai) {
// CObjWellTrack *pTWellTrack=dynamic_cast<CObjWellTrack *>(pPai);
// if(pTWellTrack) {
// return pTWellTrack;
// }
// else {
// CObjWellLogTrack *pTWellLogTrack=dynamic_cast<CObjWellLogTrack *>(pPai);
// if(pTWellLogTrack) {
// CObjWellTrack *pTWellTrack=dynamic_cast<CObjWellTrack *>(pTWellLogTrack->GetWellTrack());
// if(pTWellTrack) {
// return pTWellTrack;
// }
// }
// }
// pPai=pPai->GetParent();
// }
return NULL;
}
QString CObjWellLog::GetDescription()
{
//if(!isRun)
{
CLogIO *logio=new CLogIO();
QString slfFileName=GetSlfFileName();
if(slfFileName.isEmpty()) return "";
if(!logio->Open(slfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
return "";
}
QString name=GetName();
int i=logio->OpenCurve(name.toStdString().c_str());
if(i<0) {
delete logio;
return "";
}
logio->GetCurveInfo(i,&acurveinfo);
if(acurveinfo.DepLevel!=0&&acurveinfo.EndDepth-acurveinfo.StartDepth>0)
{
if(acurveinfo.MaxValue==acurveinfo.MinValue||acurveinfo.MaxValue==-99999||acurveinfo.MaxValue==-9999||acurveinfo.MinValue==999999||acurveinfo.MinValue==999999||acurveinfo.MinValue==99999||acurveinfo.MinValue==99999||acurveinfo.MinValue==-9999)
{
MyDataTypeEnum vVdl;
DWORD count=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5;
DWORD len=count*acurveinfo.CodeLen;
acurveinfo.MinValue=99999999;
acurveinfo.MaxValue=-99999999;
if(acurveinfo.CodeLen==8) acurveinfo.MinValue=99999999;
vVdl.vchar=new char[len];
len=logio->ReadCurve(i, acurveinfo.StartDepth,count,(void *)vVdl.vchar);
if(!len) {
delete vVdl.vchar;
delete logio;
return "data error";
}
for(int kk=0;kk<count;kk=kk+10)
{
float buf[200];
buf[0]=0;
float temp=logio->GetData(acurveinfo.RepCode,&vVdl.vchar[kk*acurveinfo.CodeLen],buf);
if(temp==-9999.0||temp==-999.25||temp==-99999.0) continue;
#ifdef WIN32
if(_isnan(temp)||!_finite(temp)) continue;
#else
if(__isnan(temp)||!__finite(temp)) continue;
#endif // WIN32
2025-11-10 16:35:40 +08:00
if(acurveinfo.MaxValue<temp) acurveinfo.MaxValue=temp;
if(acurveinfo.MinValue>temp) acurveinfo.MinValue=temp;
}
logio->SetCurveInfo(i,&acurveinfo);
delete vVdl.vchar;
}
}
logio->CloseCurve(i);
delete logio;
}
if(acurveinfo.RepCode<1) acurveinfo.RepCode=1;
if(acurveinfo.RepCode>12) acurveinfo.RepCode=12;
QString result="";
result.append("对象类型:曲线\n");
result.append("曲线名:").append(acurveinfo.Name).append("\n");
result.append("曲线别名:").append(QString::fromStdString(acurveinfo.AliasName)).append("\n");
result.append("本地数据文件:").append(GetSlfFileName()).append("\n");
result.append("顶深:").append(QString::number(acurveinfo.StartDepth)).append("\n");
result.append("底深:").append(QString::number(acurveinfo.EndDepth)).append("\n");
result.append("采样间隔:").append(QString::number(acurveinfo.DepLevel)).append("\n");
result.append("数据类型:").append(Rep_STR[acurveinfo.RepCode-1]).append("\n");
result.append("字节长度:").append(QString::number(acurveinfo.CodeLen)).append("\n");
result.append("最小值:").append(QString::number(acurveinfo.MinValue)).append("\n");
result.append("最大值:").append(QString::number(acurveinfo.MaxValue)).append("\n");
result.append("单位:").append(QString::fromStdString(acurveinfo.Unit)).append("\n");
return result;
}
double CObjWellLog::GetRlev()
{
if(m_Rlev==0) m_Rlev=0.125;
return m_Rlev;
}
void CObjWellLog::SetRlev(float rlev)
{
m_Rlev=rlev;
}
double CObjWellLog::GetShiftOffset()
{
return m_DepthOffset;
}
void CObjWellLog::SetShiftOffset(double DepthOffset)
{
m_DepthOffset=DepthOffset;
}
float CObjWellLog::GetPropertyMin()
{
return m_fPropertMin;
}
// pai::ios::welllog::WelllogCurve & CObjWellLog::GetLogCurve()
// {
// return m_logCurve;
// }
float CObjWellLog::GetPropertyMax()
{
return m_fPropertMax;
}
void CObjWellLog::ReCalculateMinMax()
{
_CalculateMinMax(true);
}
void CObjWellLog::_CalculateMinMax(bool force)
{
if( m_fPropertMin < m_fPropertMax && force == false) return;
if(!m_vMD.size()) {
return;
}
if( m_vProperty.size() )
{
double val=0;
int size=m_vProperty.size();
m_fPropertMin =99999999999.0;
m_fPropertMax =-99999999999.0;
for(int i=0;i<size;i++) {
val=GetData(i);
if(val==-9999||val==-999.25||val==-99999) continue;
if(m_fPropertMin>val) m_fPropertMin=val;//m_vProperty.m_vProperty[i];
if(m_fPropertMax<val) m_fPropertMax=val;//m_vProperty.m_vProperty[i];
}
if(m_fPropertMin ==99999999999.0) m_fPropertMin=1;
if(m_fPropertMax ==-99999999999.0) m_fPropertMin=100;
acurveinfo.MaxValue=m_fPropertMax;
acurveinfo.MinValue=m_fPropertMin;
}
}
CObjWellLog::~CObjWellLog()
{
m_vMD.clear();
m_vMDShifting.clear();
m_vProperty.clear();
QString name=m_SlfFileName+GetName();
if(IsMappingMem(name.toStdString().c_str()))
{
{
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
}
}
void CObjWellLog::SetSlfFileName( QString filePath )
{
m_SlfFileName = filePath;
// QList<PaiObject*> wellLogTracks;
// this->GetChildren(wellLogTracks);
// for(int j=0;j<wellLogTracks.size();j++) {
// if(wellLogTracks[j]==this) continue;
// CObjWellLog* tempWellLog= dynamic_cast<CObjWellLog*>(wellLogTracks[j]);
// if(tempWellLog) {
// tempWellLog->SetSlfFileName(filePath);
// }
// }
}
QString CObjWellLog::GetSlfFileName()
{
return m_SlfFileName;
}
QUuid CObjWellLog::GetTypeID()const
{
return GetClassID_WellLog();
}
void CObjWellLog::SetBelongID()
{
// pai::objectmodel::PaiObject* paiWelllogRound = this->GetForebear(GetClassID_WellLogRound());
// if(paiWelllogRound)
// {
// pai::datamodel::CObjWelllogRound *currentWelllogRound= dynamic_cast<pai::datamodel::CObjWelllogRound*>(paiWelllogRound);
// if(currentWelllogRound)
// {
// pai::ios::welllog::DataObject* dbWelllogRound = currentWelllogRound->GetDbObject();
// if(dbWelllogRound)
// {
// m_logCurve.SetDataBelongID(dbWelllogRound->GetDataID());
// }
// }
// }
}
void CObjWellLog::SetShiftBottomDepth( double bottomDepth )
{
m_ShiftBottomDepth=bottomDepth;
}
void CObjWellLog::SetShiftTopDepth( double topDepth )
{
m_ShiftTopDepth=topDepth;
}
void CObjWellLog::SetBottomDepth( double bottomDepth )
{
m_BottomDepth=bottomDepth;
}
void CObjWellLog::SetTopDepth( double topDepth )
{
m_TopDepth=topDepth;
}
void CObjWellLog::SetpropertyMin( float Propertymin )
{
m_fPropertMin= Propertymin;
}
void CObjWellLog::SetpropertyMax( float Propertymax )
{
m_fPropertMax=Propertymax;
}
// bool CObjWellLog::Serialize( CObjectArchive &ar )
// {
// if(ar.IsStoring())
// {
// BEGIN_WRITE_OBJECT( ar,1 );
// BEGIN_WRITE_BLOCK( ar, 1);
// ar << HasFlag(PaiObject::VisibibleOnTree);
// ar <<m_SlfFileName;
// CBaseObjectImpl::Serialize( ar );
// ar <<m_fPropertMin;
// ar <<m_fPropertMax;
// ar <<m_TopDepth;
// ar <<m_BottomDepth;
// ar <<QString::fromStdString(m_logCurve.GetCurveAlias());
// ar <<QString::fromStdString(m_logCurve.GetFamilyType());
// ar <<QString::fromStdString(m_logCurve.GetUnit());
// ar <<m_logCurve.GetSampleInterval();
// END_WRITE_BLOCK( ar, 1 );
// END_WRITE_OBJECT( ar );
// }
// else
// {
// BEGIN_READ_OBJECT( ar,1 );
// BEGIN_READ_BLOCK( 1 );
// bool visible = true;
// ar >> visible;
// SetFlagEnable(PaiObject::VisibibleOnTree, visible);
// ar >>m_SlfFileName;
// CBaseObjectImpl::Serialize( ar );
// ar >>m_fPropertMin;
// ar >>m_fPropertMax;
// ar >>m_TopDepth;
// ar >>m_BottomDepth;
// QString strtmp;
// ar >>strtmp;m_logCurve.SetCurveAlias(strtmp.toStdString());
// ar >>strtmp;m_logCurve.SetFamilyType(strtmp.toStdString());
// ar >>strtmp;m_logCurve.SetUnit(strtmp.toStdString());
// float tmpfloat;
// ar >>tmpfloat;m_logCurve.SetSampleInterval(tmpfloat);
// END_READ_BLOCK( 1 );
// END_READ_OBJECT( ar );
// }
// return true;
// }
void CObjWellLog::GetValidMDProperty( PFLOATPROPERTY &vMD,PFLOATPROPERTY &vProperty,float sdep,float edep)
{
if(m_SlfFileName=="") return;
if(sdep>=edep){
if(sdep!=-99999) return;
}
isRun=true;
QString name=m_SlfFileName+GetName();
if(key!=name) {
vMD.SetSize(0);
vMD.m_vProperty=0;
vProperty.SetSize(0);
vProperty.m_vProperty=NULL;
if(IsMappingMem(key.toStdString().c_str()))
{
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
key="";
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
return;
}
int curveindex=logio->OpenCurve(GetName().toStdString().c_str());
if(curveindex<0)
{
delete logio;
return;
}
Slf_CURVE acurveinfo;
logio->GetCurveInfo(curveindex,&acurveinfo);
if(acurveinfo.DepLevel==0) {
acurveinfo.DepLevel=0.125;
logio->DiscardObject(curveindex);
delete logio;
return;
}
m_ObjectType=CURVE_OBJECT;
int samplenum=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5;
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
key=name;
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,3*sizeof(float)+sizeof(int)+acurveinfo.CodeLen*(samplenum+1),name.toStdString().c_str());
if(!m_Handle||!m_SharedMemory) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
key="";
return;
}
float *buffer=(float*)m_SharedMemory;
buffer[0]=acurveinfo.StartDepth;
buffer[1]=acurveinfo.EndDepth;
buffer[2]=acurveinfo.DepLevel;
((int *)buffer)[3]=samplenum;
logio->ReadCurve(curveindex,acurveinfo.StartDepth,samplenum,(void *)&buffer[4]);
if(acurveinfo.MaxValue==acurveinfo.MinValue||acurveinfo.MaxValue==-99999||acurveinfo.MaxValue==-9999||acurveinfo.MinValue==999999||acurveinfo.MinValue==999999||acurveinfo.MinValue==99999||acurveinfo.MinValue==99999||acurveinfo.MinValue==-9999)
{
if(acurveinfo.MaxValue==acurveinfo.MinValue||acurveinfo.MaxValue==-99999||acurveinfo.MaxValue==-9999||acurveinfo.MinValue==999999||acurveinfo.MinValue==999999||acurveinfo.MinValue==99999||acurveinfo.MinValue==99999||acurveinfo.MinValue==-9999)
{
ReCalculateMinMax();
acurveinfo.MaxValue=m_fPropertMax;
acurveinfo.MinValue=m_fPropertMin;
logio->SetCurveInfo(curveindex,&acurveinfo);
}
}
delete logio;
}
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
if(IsMappingMem(name.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
delete logio;
vMD.SetSize(0);
vMD.m_vProperty=0;
vProperty.SetSize(0);
vProperty.m_vProperty=NULL;
key="";
return;
}
int curveindex=logio->OpenCurve((char *)GetName().toStdString().c_str());
if(curveindex<0) {
if(IsMappingMem(name.toStdString().c_str()))
{
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
delete logio;
vMD.SetSize(0);
vMD.m_vProperty=0;
vProperty.SetSize(0);
vProperty.m_vProperty=NULL;
key="";
return;
}
logio->GetCurveInfo(curveindex,&acurveinfo);
delete logio;
vMD.clear();
vProperty.clear();
vMD.SetSize(3);
int samplenum=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5;
if(!m_SharedMemory)
{
m_SharedMemory=NULL;
m_Handle=NULL;
int len=3*sizeof(float)+sizeof(int)+acurveinfo.CodeLen*(samplenum+1);
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,len,key.toStdString().c_str());
}
else {
vMD.m_vProperty=(float *)m_SharedMemory;
if(m_vMD.m_vProperty)
{
int samplenum1=(m_vMD.m_vProperty[1]-m_vMD.m_vProperty[0])/m_vMD.m_vProperty[2]+1.5;
if(samplenum1==samplenum){
m_vMD.m_vProperty[0]=acurveinfo.StartDepth;
m_vMD.m_vProperty[1]=acurveinfo.EndDepth;
m_vMD.m_vProperty[2]=acurveinfo.DepLevel;
}
else {
isLoad=false;
LoadFromSLF();
vMD.m_vProperty=(float *)m_SharedMemory;
m_vProperty.m_vProperty=&m_vMD.m_vProperty[4];
}
}
}
if(!vMD.m_vProperty) {
vMD.SetSize(0);
vProperty.SetSize(0);
vProperty.m_vProperty=NULL;
if(IsMappingMem(name.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
key="";
return;
}
int size=((int *)m_SharedMemory)[3];
vProperty.SetSize(size);
vProperty.m_vProperty=&vMD.m_vProperty[4];
if(m_vMD.size()>0){
m_TopDepth=m_vMD.m_vProperty[0];
m_BottomDepth=m_vMD.m_vProperty[1];
m_Rlev=m_vMD.m_vProperty[2];
}
}
void CObjWellLog::MoveShift()
{
MoveShift(m_ShiftTopDepth,m_ShiftBottomDepth,m_DepthOffset);
}
void CObjWellLog::EShiftDepth(int count,float *sdeps,float *edeps)
{
if(m_SlfFileName=="") return;
CMemRdWt * logio=new CMemRdWt();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return;
}
int curveindex=logio->FindObjectName((char*)GetName().toStdString().c_str());
if(curveindex<0)
{
delete logio;
return;
}
CString szBuffer1="";
CString szBuffer="";
for(int i=0;i<count;i++)
{
szBuffer1.Format("%10.3f %10.3f\r\n",sdeps[i],edeps[i]);
szBuffer+=szBuffer1;
}
WriteShiftMessage(*logio,szBuffer,GetName());
logio->EShiftDepth((char*)GetName().toStdString().c_str(),2,sdeps,edeps);
delete logio;
if(isRun) {
isLoad=false;
LoadFromSLF();
}
}
void CObjWellLog::MoveShift(float sdep,float edep,float delta)
{
if(sdep>=edep&&delta==0) return;
if(m_SlfFileName=="") return;
CMemRdWt * logio=new CMemRdWt();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return;
}
int curveindex=logio->FindObjectName((char*)GetName().toStdString().c_str());
if(curveindex<0)
{
delete logio;
return;
}
CString szBuffer="";
if(sdep==edep&&sdep==-9999.0) {
szBuffer=QString::number(delta,'f',3)+"\r\n";
WriteShiftMessage(*logio,szBuffer,GetName());
logio->CorrectObjectDepth(curveindex,delta);
delete logio;
if(isRun) {
isLoad=false;
LoadFromSLF();
}
return;
}
curveindex=logio->OpenChannel(GetName().toStdString().c_str());
if(curveindex>-1) {
szBuffer.Format("%10.3f %10.3f %10.3f\r\n",sdep,edep,delta);
WriteShiftMessage(*logio,szBuffer,GetName());
logio->MoveDepth(curveindex,sdep,edep,delta);
}
else {
int ObjectType=logio->GetObjectType(GetName().toStdString().c_str());
float sdeps[2],edeps[2];
sdeps[0]=sdep;
edeps[0]=sdep+delta;
sdeps[1]=edep;
edeps[1]=edep+delta;
szBuffer.Format("%10.3f %10.3f\r\n%10.3f %10.3f\r\n",sdeps[0],edeps[0],sdeps[1],edeps[1]);
WriteShiftMessage(*logio,szBuffer,GetName());
if(ObjectType >CARD_OBJECT||ObjectType==0)
{
int index=logio->OpenTable(GetName().toStdString().c_str());
if(index>-1)
{
logio->EShiftTableDepth((char*)GetName().toStdString().c_str(),2,sdeps,edeps);
}
}
else if(ObjectType==CARD_OBJECT) {
logio->EshiftStreamDepth((char *)GetName().toStdString().c_str(),2,sdeps,edeps);
}
}
delete logio;
if(isRun) {
isLoad=false;
LoadFromSLF();
}
}
void CObjWellLog::GetZoneMDProperty( FLOATPROPERTY &vMD,FLOATPROPERTY &vProperty ,float sdep,float edep)
{
if(!m_vMD.size()) {
GetValidMDProperty(m_vMD,m_vProperty,-99999,99999);
}
if(m_vMD.size()<3) return;
if(edep==99999) edep=m_vMD.m_vProperty[1];
if(sdep==-99999) sdep=m_vMD.m_vProperty[0];
int size=(edep-sdep)/m_vMD.m_vProperty[2]+1.5;
vProperty.SetSize(size);
int j=(sdep-m_vMD.m_vProperty[0])/m_vMD.m_vProperty[2];
int i=0;
if(j<0) {
i=(m_vMD.m_vProperty[0]-sdep)/m_vMD.m_vProperty[2];
j=0;
}
if(j>=m_vProperty.size()) return;
if(edep>m_vMD.m_vProperty[1]) edep=m_vMD.m_vProperty[1];
int jj=(edep-m_vMD.m_vProperty[0])/m_vMD.m_vProperty[2];
if(jj<=0) return;
vMD.SetSize(3);
vMD.m_vProperty[0]=sdep;
vMD.m_vProperty[1]=edep;
vMD.m_vProperty[2]=m_vMD.m_vProperty[2];
if(acurveinfo.RepCode==REPR_FLOAT) {
memmove(&vProperty.m_vProperty[i],&m_vProperty.m_vProperty[j],sizeof(float)*(jj-j));
}
else {
for(int k=j;k<jj;k++) {
vProperty.m_vProperty[k]=GetData(k-j+i);
}
}
}
double CObjWellLog::GetData(int repCode,char *buffer,int repLen)
{
double yy=-99999;
if(!buffer)
{
return 0;
}
switch(repCode)
{
case REPR_INT: //0
yy=(double)(*((int*)buffer));
break;
case REPR_SHORT: //1
yy=(double)(*((short *)buffer));
break;
case REPR_LONG://2
yy=(double)(*((long *)buffer));
break;
case REPR_FLOAT://3
yy=(double)(*((float *)buffer));
break;
case REPR_DOUBLE://4
yy=(double)(*((double *)buffer));
break;
case REPR_CHAR://5
yy=(double)(*((char *)buffer));
break;
case REPR_UCHAR://6
yy=(double)(*((unsigned char *)buffer));
break;
case REPR_USHORT://7
yy=(double)(*((unsigned short *)buffer));
break;
case REPR_UINT://8
yy=(double)(*((unsigned int *)buffer));
break;
case REPR_ULONG://9
yy=(double)(*((unsigned long *)buffer));
break;
case REPR_STRING://10
if(repLen>=200) repLen=199;
if(repLen>0) {
memmove(m_strValue,buffer,repLen);
m_strValue[repLen]=0;
}
else m_strValue[0]=0;
break;
}
return yy;
}
void CObjWellLog::SetData(int repCode,char *buffer,double yy)
{
if(!buffer)
{
return;
}
switch(repCode)
{
case REPR_INT: //0
(*((int*)buffer))=(int)yy;
break;
case REPR_SHORT: //1
(*((short *)buffer))=(short)yy;
break;
case REPR_LONG://2
(*((long *)buffer))=(long)yy;
break;
case REPR_FLOAT://3
(*((float *)buffer))=yy;
break;
case REPR_DOUBLE://4
(*((double *)buffer))=(double)yy;
break;
case REPR_CHAR://5
(*((char *)buffer))=(char)yy;
break;
case REPR_UCHAR://6
(*((unsigned char *)buffer))=(unsigned char)yy;
break;
case REPR_USHORT://7
(*((unsigned short *)buffer))=(unsigned short)yy;
break;
case REPR_UINT://8
(*((unsigned int *)buffer))=(unsigned int)yy;
break;
case REPR_ULONG://9
(*((unsigned long *)buffer))=(unsigned long )yy;
break;
case REPR_STRING://10
// *yy=-99999;
break;
}
return;
}
double CObjWellLog::GetData(float dep,char *buffer)
{
if(dep>=acurveinfo.StartDepth&&dep<=acurveinfo.EndDepth) {
int i=(dep-acurveinfo.StartDepth)/acurveinfo.DepLevel+0.5;
double yy=GetData(i,buffer);
return yy;
}
else {
if(acurveinfo.RepCode==REPR_STRING&&buffer) buffer[0]=0;
return -9999;
}
}
double CObjWellLog::GetData(int i,char *buffer)
{
if(!m_vProperty.size()) return -9999;
if(!m_vProperty.m_vProperty) return -9999;
double yy=-9999;
if(m_vProperty.size()>i) {
yy=GetData(acurveinfo.RepCode,(char *)&((char *)m_vProperty.m_vProperty)[i*acurveinfo.CodeLen],acurveinfo.CodeLen);
}
if(acurveinfo.RepCode==REPR_STRING&&buffer) strcpy(buffer,m_strValue);
return yy;
}
void CObjWellLog::SetData(float dep,float *value)
{
if(dep>=acurveinfo.StartDepth&&dep<=acurveinfo.EndDepth) {
int i=(dep-acurveinfo.StartDepth)/acurveinfo.DepLevel+0.5;
SetData(i,value);
}
}
void CObjWellLog::SetData(float dep,float value)
{
if(dep>=acurveinfo.StartDepth&&dep<=acurveinfo.EndDepth) {
int i=(dep-acurveinfo.StartDepth)/acurveinfo.DepLevel+0.5;
SetData(i,&value);
}
}
void CObjWellLog::SetData(int i,float *value)
{
if(!m_vProperty.m_vProperty) return;
if(acurveinfo.RepCode!=REPR_STRING) {
double val=*value;
SetData(acurveinfo.RepCode,&((char *)m_vProperty.m_vProperty)[i*acurveinfo.CodeLen],val);
}
else {
memmove(&((char *)m_vProperty.m_vProperty)[i*acurveinfo.CodeLen],value,acurveinfo.CodeLen);
}
}
void CObjWellLog::GetMDProperty(FLOATPROPERTY &vMD,FLOATPROPERTY &vProperty)
{
if(!m_vMD.size()) {
GetValidMDProperty(m_vMD,m_vProperty,-99999,99999);
}
if(m_vMD.size()<3) return;
vMD.SetSize(m_vMD.size());
vProperty.SetSize(m_vProperty.size());
if(acurveinfo.RepCode==REPR_FLOAT) {
memmove(vProperty.m_vProperty,m_vProperty.m_vProperty,sizeof(float)*m_vProperty.size());
}
else {
for(int k=0;k<vProperty.size();k++) {
vProperty.m_vProperty[k]=GetData(k);
}
}
memmove(vMD.m_vProperty,m_vMD.m_vProperty,sizeof(float)*m_vMD.size());
return;
}
CObjWell *CObjWellLog::GetWell()
{
// if(m_pObjWell) return m_pObjWell;
// PaiObject *pParent = GetParent();
// while( pParent )
// {
// CObjWell *pWell = dynamic_cast<CObjWell *>( pParent );
// if( pWell ) {
// m_pObjWell=pWell;
// return pWell;
// }
// pParent = pParent->GetParent();
// }
return NULL;
}
CObjWelllogRound *CObjWellLog::GetWelllogRound()
{
// PaiObject *pParent = GetParent();
// while( pParent )
// {
// CObjWelllogRound *pWellRound = dynamic_cast<CObjWelllogRound *>( pParent );
// if( pWellRound ) return pWellRound;
// pParent = pParent->GetParent();
// }
return NULL;
}
double CObjWellLog::GetShiftTopDepth()
{
return m_ShiftTopDepth;
}
double CObjWellLog::GetShiftBottomDepth()
{
return m_ShiftBottomDepth;
}
double CObjWellLog::GetTopDepth()
{
return m_TopDepth;
}
double CObjWellLog::GetBottomDepth()
{
return m_BottomDepth;
}
PFLOATPROPERTY &CObjWellLog::GetProperty( )
{
if(!m_vProperty.size())
{
m_vMD.clear();
m_vProperty.clear();
GetValidMDProperty(m_vMD,m_vProperty,-99999.0,99999.0);
}
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
if(IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
key="";
}
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
m_TopDepth=0;
m_BottomDepth=0;
return m_vProperty;
}
QString name=m_SlfFileName+GetName();
int index=logio->FindObjectName((char *)GetName().toStdString().c_str());
if(index<0) {
if(IsMappingMem(name.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
key="";
}
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
m_TopDepth=0;
m_BottomDepth=0;
return m_vProperty;
}
delete logio;
if(!IsMappingMem(name.toStdString().c_str())) {
isLoad=false;
LoadFromSLF();
}
if(m_vMD.size()>0&&m_TopDepth!=m_vMD.m_vProperty[0]){
m_TopDepth=m_vMD.m_vProperty[0];
m_BottomDepth=m_vMD.m_vProperty[1];
m_Rlev=m_vMD.m_vProperty[2];
}
return m_vProperty;
}
PFLOATPROPERTY &CObjWellLog::GetMD( )
{
if(!m_vMD.size()) {
GetValidMDProperty(m_vMD,m_vProperty,-99999.0,99999.0);
}
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
if(IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
key="";
}
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
m_TopDepth=0;
m_BottomDepth=0;
return m_vProperty;
}
QString name=m_SlfFileName+GetName();
int index=logio->FindObjectName((char *)GetName().toStdString().c_str());
if(index<0) {
if(IsMappingMem(name.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
key="";
}
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
m_TopDepth=0;
m_BottomDepth=0;
return m_vProperty;
}
logio->GetCurveInfo(index,&acurveinfo);
delete logio;
if(!IsMappingMem(name.toStdString().c_str())) {
isLoad=false;
LoadFromSLF();
}
if(m_vMD.size()>0&&m_TopDepth!=m_vMD.m_vProperty[0]){
m_TopDepth=m_vMD.m_vProperty[0];
m_BottomDepth=m_vMD.m_vProperty[1];
m_Rlev=m_vMD.m_vProperty[2];
}
return m_vMD;
}
void CObjWellLog::SetProperty(PFLOATPROPERTY *vMD,PFLOATPROPERTY *vProperty )
{
if(m_vProperty.m_vProperty!=vProperty->m_vProperty) {
if(m_vProperty.size()!=vProperty->size())
{
m_vProperty.SetSize(vProperty->size());
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,vMD->size()*sizeof(float)+sizeof(int)+(vProperty->size()+1)*sizeof(float),key.toStdString().c_str());
}
m_vProperty.m_vProperty=&((float*)m_SharedMemory)[4];
memmove(m_vProperty.m_vProperty,vProperty->m_vProperty,sizeof(float)*vProperty->size());
}
SetMD(vMD);
// SetModified(true,false);
SaveToSLF();
}
void CObjWellLog::SetProperty(PFLOATPROPERTY *vMD,FLOATPROPERTY *vProperty )
{
if(m_vProperty.m_vProperty!=vProperty->m_vProperty) {
if(m_vProperty.size()!=vProperty->size())
{
m_vProperty.SetSize(vProperty->size());
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,vMD->size()*sizeof(float)+sizeof(int)+(vProperty->size()+1)*sizeof(float),key.toStdString().c_str());
}
m_vProperty.m_vProperty=&((float*)m_SharedMemory)[4];
memmove(m_vProperty.m_vProperty,vProperty->m_vProperty,sizeof(float)*vProperty->size());
}
SetMD(vMD);
// SetModified(true,false);
SaveToSLF();
}
void CObjWellLog::SetMD(PFLOATPROPERTY *vMD )
{
if(m_vMD.m_vProperty!=vMD->m_vProperty) {
if(m_vMD.m_vProperty) {
memmove(m_vMD.m_vProperty,vMD->m_vProperty,sizeof(float)*vMD->size());
}
}
}
void CObjWellLog::SetProperty(FLOATPROPERTY *vMD,FLOATPROPERTY *vProperty )
{
if(m_vProperty.m_vProperty!=vProperty->m_vProperty) {
if(m_vProperty.size()!=vProperty->size())
{
m_vProperty.SetSize(vProperty->size());
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,vMD->size()*sizeof(float)+sizeof(int)+(vProperty->size()+1)*sizeof(float),key.toStdString().c_str());
}
m_vProperty.m_vProperty=&((float*)m_SharedMemory)[4];
memmove(m_vProperty.m_vProperty,vProperty->m_vProperty,sizeof(float)*vProperty->size());
}
SetMD(vMD);
// SetModified(true,false);
SaveToSLF();
}
void CObjWellLog::SetMD(FLOATPROPERTY *vMD )
{
if(m_vMD.m_vProperty!=vMD->m_vProperty) {
if(m_vMD.m_vProperty) {
memmove(m_vMD.m_vProperty,vMD->m_vProperty,sizeof(float)*vMD->size());
}
}
}
pai::ios::welllog::DataObject *CObjWellLog::GetDbObject()
{
// if(m_SlfFileName==""){
// SetBelongID();
// return &m_logCurve;
// }
// else //slf文件存储的情况下不存到数据库
return NULL;
}
QVariant CObjWellLog::GetTemplateKey()
{
QVariant val;
return val;
//TODO
//增加了一级分类templatekey需要增加这个
// QVariant val=CBaseObject::GetTemplateKey();
// QString sTemplateKey=val.toString();
// int i=sTemplateKey.lastIndexOf("/");
// if(i<0) {
// /* QString left;
// QString curvename=GetName();
// if(i>-1) left=sTemplateKey.left(i)+"/"+curvename;
// else left=sTemplateKey+"/"+curvename;
// SetTemplateKey(left);
// val=left;
// */
// QString categoryName="";
// if(!GetParent()) return categoryName;
// if(GetParent()->GetTypeID()!=GetClassID_Well()&&GetParent()->GetTypeID()!=GetClassID_WellLogRound()) categoryName=this->GetParent()->GetName();
// if(categoryName!="") categoryName=categoryName.append("/");
// if(GetGhostName()!="") categoryName=categoryName+GetGhostName();
// else categoryName=categoryName+GetName();
// SetTemplateKey(categoryName);
// val=categoryName;
// }
// return val;
}
CBaseObject *CObjWellLog::CloneObject()
{
// CBaseObject * result=CBaseObject::CloneObject();
// CObjWellLog * pCopyedWellLog = dynamic_cast<CObjWellLog*>(result);
// if(pCopyedWellLog) pCopyedWellLog->SetWell(m_pObjWell);
// return pCopyedWellLog;
return NULL;
}
QStringList CObjWellLog::GetColumnHeadList()
{
QStringList strlist;
strlist<<"深度值"<<"属性值";
return strlist;
}
//从slf加载数据
bool CObjWellLog::LoadFromSLF()
{
if(m_SlfFileName=="") {
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
key="";
}
return true;
}
isRun=true;
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str()))
{
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
key="";
}
QString name=m_SlfFileName+GetName();
if(IsMappingMem(name.toStdString().c_str()))
{
// GetObjectEvent().OnDeAttchData(m_SlfFileName,GetName());
}
m_SharedMemory=NULL;
m_Handle=NULL;
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
return false;
}
int curveindex=logio->OpenCurve(GetName().toStdString().c_str());
if(curveindex<0)
{
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
return false;
}
m_ObjectType=CURVE_OBJECT;
logio->GetCurveInfo(curveindex,&acurveinfo);
int samplenum=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5;
if(acurveinfo.DepLevel==0) {
acurveinfo.DepLevel=0.125;
logio->DiscardObject(curveindex);
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
return false;
}
key=name;
int len=3*sizeof(float)+sizeof(int)+acurveinfo.CodeLen*(samplenum+1);
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,len,key.toStdString().c_str());
if(!m_Handle||!m_SharedMemory) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,3*sizeof(float)+sizeof(int)+acurveinfo.CodeLen*(samplenum+1),key.toStdString().c_str());
if(!m_Handle||!m_SharedMemory) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
return false;
}
}
float *buffer=(float*)m_SharedMemory;
buffer[0]=acurveinfo.StartDepth;
buffer[1]=acurveinfo.EndDepth;
buffer[2]=acurveinfo.DepLevel;
((int *)buffer)[3]=samplenum;
logio->ReadCurve(curveindex,acurveinfo.StartDepth,samplenum,(void*)&buffer[4]);
logio->Clear();
delete logio;
m_vMD.SetSize(3);
m_vMD.m_vProperty=(float *)m_SharedMemory;
int size=((int *)m_SharedMemory)[3];
m_vProperty.SetSize(size);
m_vProperty.m_vProperty=&m_vMD.m_vProperty[4];
if(m_vMD.size()>0){
m_TopDepth=m_vMD.m_vProperty[0];
m_BottomDepth=m_vMD.m_vProperty[1];
m_Rlev=m_vMD.m_vProperty[2];
}
m_ShiftTopDepth=-9999;
m_ShiftBottomDepth=-9999;
m_DepthOffset=0;
isLoad=true;
// SetModified(false,false);
// GetObjectEvent().OnRefreshData(GetSlfFileName(),GetName(),this);
return true;
}
//从slf加载数据
int CObjWellLog::IsObjectExist(QString name)
{
if(m_SlfFileName=="") return true;
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return false;
}
int curveindex=logio->FindObjectName((char *)name.toStdString().c_str());
delete logio;
return curveindex;
}
bool CObjWellLog::DeleteData(float Stdep,float Endep)
{
SetModify(true);
SaveToSLF();
if(m_SlfFileName=="") return true;
isRun=true;
isLoad=false;
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
return false;
}
int curveindex=logio->OpenCurve(GetName().toStdString().c_str());
if(curveindex<0)
{
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
return false;
}
m_ObjectType=CURVE_OBJECT;
logio->GetCurveInfo(curveindex,&acurveinfo);
acurveinfo.StartDepth=Stdep;
acurveinfo.EndDepth=Endep;
int samplenum=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5;
QString name=m_SlfFileName+GetName();
if(acurveinfo.DepLevel==0) {
acurveinfo.DepLevel=0.125;
logio->DiscardObject(curveindex);
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
return false;
}
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,3*sizeof(float)+sizeof(int)+acurveinfo.CodeLen*(samplenum+1),key.toStdString().c_str());
if(!m_Handle||!m_SharedMemory) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,3*sizeof(float)+sizeof(int)+acurveinfo.CodeLen*(samplenum+1),key.toStdString().c_str());
if(!m_Handle||!m_SharedMemory) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
return false;
}
}
float *buffer=(float*)m_SharedMemory;
buffer[0]=acurveinfo.StartDepth;
buffer[1]=acurveinfo.EndDepth;
buffer[2]=acurveinfo.DepLevel;
((int *)buffer)[3]=samplenum;
logio->ReadCurve(curveindex,acurveinfo.StartDepth,samplenum,(void*)&buffer[4]);
logio->CloseCurve(curveindex);
logio->DiscardObject(curveindex);
curveindex=logio->CreateCurve(&acurveinfo);
if(curveindex>-1) logio->WriteCurve(curveindex,acurveinfo.StartDepth,samplenum,(void*)&buffer[4]);
logio->Clear();
delete logio;
m_vMD.SetSize(3);
m_vMD.m_vProperty=(float *)m_SharedMemory;
int size=((int *)m_SharedMemory)[3];
m_vProperty.SetSize(size);
m_vProperty.m_vProperty=&m_vMD.m_vProperty[4];
if(m_vMD.size()>0){
m_TopDepth=m_vMD.m_vProperty[0];
m_BottomDepth=m_vMD.m_vProperty[1];
m_Rlev=m_vMD.m_vProperty[2];
}
isLoad=true;
// SetModified(false,false);
return true;
}
bool CObjWellLog::ExpendData(bool ishead,float Depth)
{
// SetModify(true);
// SaveToSLF();
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(m_SlfFileName=="") {
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
return true;
}
isLoad=false;
isRun=true;
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
return false;
}
int curveindex=logio->OpenCurve(GetName().toStdString().c_str());
if(curveindex<0)
{
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
return false;
}
m_ObjectType=CURVE_OBJECT;
logio->GetCurveInfo(curveindex,&acurveinfo);
if(ishead) acurveinfo.StartDepth=Depth;
else acurveinfo.EndDepth=Depth;
if(acurveinfo.EndDepth<acurveinfo.StartDepth) {
AfxMessageBox("起始深度〉结束深度,错误!");
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
return false;
}
if(acurveinfo.DepLevel==0) {
acurveinfo.DepLevel=0.125;
logio->DiscardObject(curveindex);
delete logio;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(!key.isEmpty()&&IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
return false;
}
int samplenum=(acurveinfo.EndDepth-acurveinfo.StartDepth)/acurveinfo.DepLevel+1.5;
QString name=m_SlfFileName+GetName();
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
if(IsMappingMem(key.toStdString().c_str())) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
}
// GetObjectEvent().OnDeAttchData(GetSlfFileName(),GetName());
while(IsMappingMem(key.toStdString().c_str())) {
QCoreApplication::processEvents();
}
key=name;
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,3*sizeof(float)+sizeof(int)+acurveinfo.CodeLen*samplenum,key.toStdString().c_str());
if(!m_Handle||!m_SharedMemory) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
MappingMem(&m_Handle,(LPSTR*)&m_SharedMemory,3*sizeof(float)+sizeof(int)+acurveinfo.CodeLen*(samplenum+1),key.toStdString().c_str());
if(!m_Handle||!m_SharedMemory) {
CloseView(m_Handle,m_SharedMemory);
m_SharedMemory=NULL;
m_Handle=NULL;
m_vMD.SetSize(0);
m_vMD.m_vProperty=0;
m_vProperty.SetSize(0);
m_vProperty.m_vProperty=NULL;
return false;
}
}
float *buffer=(float*)m_SharedMemory;
buffer[0]=acurveinfo.StartDepth;
buffer[1]=acurveinfo.EndDepth;
buffer[2]=acurveinfo.DepLevel;
((int *)buffer)[3]=samplenum;
logio->ReadCurve(curveindex,acurveinfo.StartDepth,samplenum,(void*)&buffer[4]);
logio->Clear();
delete logio;
m_vMD.SetSize(3);
m_vMD.m_vProperty=(float *)m_SharedMemory;
int size=((int *)m_SharedMemory)[3];
m_vProperty.SetSize(size);
m_vProperty.m_vProperty=&m_vMD.m_vProperty[4];
if(m_vMD.size()>0){
m_TopDepth=m_vMD.m_vProperty[0];
m_BottomDepth=m_vMD.m_vProperty[1];
m_Rlev=m_vMD.m_vProperty[2];
}
// SetModified(false,false);
isLoad=true;
return true;
}
//数据变化后写入slf数据
bool CObjWellLog::SaveToSLF()
{
bool m=false;//HasModified();
if(!m) return false;
int samplenum=m_vProperty.size();
if(!m_vMD.size()) return false;
if(samplenum<=0) return false;
if(m_SlfFileName=="") return true;
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeRead))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return false;
}
int curveindex=logio->OpenCurve(GetName().toStdString().c_str());
if(curveindex<0)
{
delete logio;
return false;
}
if(samplenum)logio->WriteCurve(curveindex,m_vMD.m_vProperty[0],samplenum,(void*)(&m_vProperty.m_vProperty[0]));
delete logio;
//qDebug()<<QString::fromStdString(GenTimeStamp())<<"数据写完成:"+GetName();
// SetModified(false,false);
return true;
}
bool CObjWellLog::DeleteFromSLF()
{
if(m_SlfFileName=="") return true;
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return false;
};
short curvetype=logio->GetObjectType(GetName().toStdString().c_str());
if(curvetype==CURVE_OBJECT||curvetype==WAVE_OBJECT)
{
Slf_CURVE info;
int index=-1;
if(curvetype==CURVE_OBJECT) index=logio->OpenCurve(GetName().toStdString().c_str());
else index=logio->OpenWave(GetName().toStdString().c_str());
logio->GetCurveInfo(index,&info);
unsigned char cs[4]={0xcd,0xcd,0xcd,0xcd};
unsigned char cs1[4]={0x0,204,204,204};
unsigned char cs2[4]={204,204,204,204};
float va=*(float*)&cs;
float va1=*(float*)&cs1;
float va2=*(float*)&cs2;
if(info.DepLevel==0||info.DepLevel==va||info.DepLevel==va1||info.DepLevel==va2||
info.StartDepth==va||info.EndDepth==va1||info.EndDepth==va2)
{
logio->DeleteObject(GetName().toStdString().c_str());
delete logio;
return true;
}
}
logio->DiscardObject(GetName().toStdString().c_str());
delete logio;
//TODO 删掉克隆的对象
}
//将内存数据清空
void CObjWellLog::clearData()
{
FLOATPROPERTY nulldata;
SetMD(&nulldata);
SetProperty(&nulldata,&nulldata);
}
void CObjWellLog::ChangeDepth(double DepthOffset)
{
//1.修改内存数据
if(m_vMD.size()) {
m_vMD.m_vProperty[0]+=DepthOffset;
m_vMD.m_vProperty[1]+=DepthOffset;
}
m_TopDepth+=DepthOffset;
m_BottomDepth+=DepthOffset;
}
void CObjWellLog::ApplyShiftDepth()
{
//1.修改内存数据
ChangeDepth(m_DepthOffset);
if(m_SlfFileName=="") return ;
CMemRdWt * logio=new CMemRdWt();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return ;
};
bool isok=0;
//TODO 目前对于表格类,参数卡类不支持,会崩溃
int curveindex=logio->FindObjectName((char *)GetName().toStdString().c_str());
if(curveindex>=0) {
CString szBuffer="";
szBuffer=QString::number(m_DepthOffset,'f',3)+"\r\n";
WriteShiftMessage(*logio,szBuffer,GetName());
logio->CorrectObjectDepth(curveindex,m_DepthOffset);
isok=1;
}
logio->GetCurveInfo(curveindex,&acurveinfo);
delete logio;
m_DepthOffset = 0;
if(isRun&&isok) {
isLoad=false;
LoadFromSLF();
}
}
void CObjWellLog::loadInfo()
{
if(m_SlfFileName=="") return ;
CMemRdWt * logio=new CMemRdWt();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return ;
};
int curveindex=logio->FindObjectName((char *)GetName().toStdString().c_str());
if(curveindex>=0) {
logio->GetCurveInfo(curveindex,&acurveinfo);
}
delete logio;
}
void CObjWellLog::AddShiftDepth(double shiftdepth)
{
m_DepthOffset += shiftdepth;
}
bool CObjWellLog::CloneInSlfFile(QString newname)
{
if(m_SlfFileName=="") return false;
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return false;
};
char* curvename=new char[65];
curvename[64]='\0';
strcpy(curvename,GetName().toStdString().c_str());
char* newcurvename=new char[65];
newcurvename[64]='\0';
strcpy(newcurvename,newname.toStdString().c_str());
logio->CopyObject(curvename,newcurvename,true);
delete[] curvename;
delete[] newcurvename;
delete logio;
}
bool CObjWellLog::CopyToSLFFile(QString targetSLFFileName,bool deleteFromSrc,char*newCurveName)
{
if(m_SlfFileName=="") return false;
CLogIO a_cslfio;
CLogIO * logio=new CLogIO();
if(!logio->Open(targetSLFFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return false;
};
if(!a_cslfio.Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
delete logio;
return false;
};
char* curvename=new char[65];
curvename[64]='\0';
strcpy(curvename,GetName().toStdString().c_str());
if(newCurveName) logio->CopyFromFile(a_cslfio,curvename,newCurveName);
else logio->CopyFromFile(a_cslfio,curvename);
delete[] curvename;
delete logio;
if(deleteFromSrc) DeleteFromSLF();
}
void CObjWellLog::SetName(const QString & name)
{
QString oldn=GetName();
if(oldn.compare(name,Qt::CaseInsensitive)==0) return;
m_name = name;
// PaiObject::SetName(name);
if(isRun) {
isLoad=false;
LoadFromSLF();
}
}
bool CObjWellLog::RenName(const QString & name)
{
if(isUsing)
return false;
//将SLF中的对象重命名
if(m_SlfFileName!="")
{
CSlfIO a_cslfio;
if(!a_cslfio.Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
m_name = name;
// PaiObject::SetName(name);
if(isRun) {
isLoad=false;
LoadFromSLF();
}
return true;
};
if(a_cslfio.RenameObject(GetName().toStdString().c_str(),name.toStdString().c_str()))
{
a_cslfio.Close();
m_name = name;
// PaiObject::SetName(name);
if(isRun){
isLoad=false;
LoadFromSLF();
}
return true;
}
}
return false;
}
void CObjWellLog::ReSample(double newDelta)
{
if(m_SlfFileName=="") return ;
CLogIO * logio=new CLogIO();
if(!logio->Open(m_SlfFileName.toStdString().c_str(),CSlfIO::modeReadWrite))
{
delete logio;
//AppendConsole(pai::log::PAI_ERROR,"SLF文件打开失败请检查");
return ;
};
bool isok=0;
int curveindex=logio->OpenChannel(GetName().toStdString().c_str());
if(curveindex>=0) {
logio->ChannelResamples(curveindex,newDelta);
isok=1;
}
delete logio;
m_Rlev=newDelta;
if(isRun&&isok) {
isLoad=false;
LoadFromSLF();
}
}
//TODO 重构void ImportDataDialog::AutoMatchFamily(WelllogCurve* acurve)
void CObjWellLog::AutoMatchFamily()
{
return;
// static std::vector<FamilyAliases> familyaliases;
// if(familyaliases.size()<=0){
// FamilyAliases aAlias;
// aAlias.GetFamilyAliases(familyaliases);
// }
// for(int i=0;i<familyaliases.size();i++)
// {
// //第一步拿名字匹配
// if(familyaliases[i].GetAlias()==GetName().toStdString())
// {
// InitCurveNameAndUnitByFamily(familyaliases[i].GetFamilyType());
// return ;
// }
// //如果不行,通过别名列表来正则表达式匹配
// else
// {
// QString aliasrule=QString::fromStdString(familyaliases[i].GetChoiceList());
// QStringList aliasrules=aliasrule.split(",");
// for(int j=0;j<aliasrules.size();j++)
// {
// if(aliasrules[j]=="") continue;
// QRegExp rx(aliasrules[j]);
// rx.setPatternSyntax(QRegExp::Wildcard);
// if(rx.exactMatch(GetName()) )
// {
// InitCurveNameAndUnitByFamily(familyaliases[i].GetFamilyType());
// return ;
// }
// }
// }
// }
}
void CObjWellLog::InitCurveNameAndUnitByFamily(std::string familyType)
{
return;
// if(familyType!=""){
// m_logCurve.SetFamilyType(familyType);
// Family aFamily;
// aFamily.GetFamilyByFamilyType(familyType);
// m_logCurve.SetUnit(aFamily.GetUnit());
// }
}
template <typename T>
void AddToWellRound(QString objname,T *aclass,char* ID,int Type)
{
// CObjWelllogRound *pWelllogRound=dynamic_cast<CObjWelllogRound*>(aclass->GetWelllogRound());
// if(pWelllogRound) {
// PaiObject*pBase=pWelllogRound->GetObjectByName(objname,ID);
// if(!dynamic_cast<T *>(pBase)){
// CObjWellLog * acurve=new T();
// if(acurve) {
// acurve->m_ObjectType=Type;
// acurve->SetName(objname);
// acurve->SetAliasName(objname);
// acurve->SetSlfFileName(pWelllogRound->GetSlfFileName());
// acurve->SetWell(pWelllogRound->GetWell());
// pWelllogRound->AddChild(acurve);
// }
// }
// }
}
// BEGIN_REGISTER_OBJECT(CObjWellLog)
// QUuid(GetClassID_WellLog())
// END_REGISTER_OBJECT( CObjWellLog );
END_OSGDATAMODEL_NAMESPACE