You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
2.7 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//文件: SegY文件操作类
//主要功能:
//
//程序编写: 2011-4-1
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "ProcessThread.h"
#include "SeisLineData.h"
#include "SeisIndex2D.h"
#include "SeisTraceReader.h"
#include "ProgressProcess.h"
#include "ProgressThreadBase.h"
namespace NSeis
{
//一条剖面据的读取操作,索引数据可以来源于三维体也可来源于二维剖面
class AFX_EXT_CLASS CSeisReaderBase
: public CProgressProcess
{
public:
CSeisReaderBase(void);
~CSeisReaderBase(void);
void AttachFile(CFileSegy* pFile); //不绑定时将自动根据打开指定的SegY文件
CFileSegy* GetFile() { return m_pFile; }
//** @brief 总的采样点个数,如果剖面全部显示时,与当前显示个数相同
unsigned short GetTotalSampleNumber() { return GetSampleInfo().GetTotalSampleNumber(); }
//获得一道的采样点个数及采样间隔, 当前显示的采样点个数
int GetCustomSampleNumber() { return GetSampleInfo().GetCustomSampleNumber(); }
//获得采样间隔
float GetSampleInterval() { return GetSampleInfo().GetSampleInterval(); }
//获得一个采样点的字节长度
int GetOneSampleBytes() { return GetSampleInfo().GetOneSampleBytes(); }
float GetStartTime() { return GetSampleInfo().GetStartTime(); }
float GetStopTime() { return GetSampleInfo().GetStopTime(); }
TInterval<int>& GetTimeRange() { return GetSampleInfo().GetTimeRange(); }
//是否是使用整道数据, 根据m_dataRange参数判断
bool IsFullyTraceData() { return GetSampleInfo().IsFullyTraceData(); }
virtual CSeisSampleInfo& GetSampleInfo() = 0;
CSeisTraceReader& GetTraceReader() { return m_traceReader; }
protected:
CSeisTraceReader m_traceReader; //在内部进行文件读操作,总是读取一整道的数据
float _undef_value; //无效值,读取切片时使用
//仅是指针指向,并不释放
CFileSegy* m_pFile;
};
class AFX_EXT_CLASS CSeisReader2D
: public CSeisReaderBase
{
public:
CSeisReader2D(void);
~CSeisReader2D(void);
//必须提前绑定相应指针
void Attach(CSeisLineData* pData, bool bReMemory=false); //绑定数据存取指针
void AttachIndex(CSeisIndexLine2D* pIndex); //绑定数据索引
virtual CSeisSampleInfo& GetSampleInfo() { return m_pIndex2D->m_sampleInfo; }
bool ReadData(); //不使用线程方式,读取测线地震剖面数据
bool ReadData(CSeisIndexLine2D* pIndex, TInterval<int>& range); //使用线程,但等待线程执行完毕
bool ReadData(CSeisIndexLine2D* pIndex, TInterval<float>& range); //使用线程,但等待线程执行完毕
CSeisIndexLine2D* GetIndex() { return m_pIndex2D; }
protected:
//仅是指针指向,并不释放
CSeisIndexLine2D* m_pIndex2D; //索引指向
CSeisLineData* m_pData; //存取的数据指向
bool m_bReMemory; //是否重新分配数据存取内存
};
} //namespace NSeis