////////////////////////////////////////////////////////////////////////////// //文件: SegY文件操作类 //主要功能: // //程序编写: 2011-4-1 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include "TInterval.h" #include "RowCol.h" #include "SeisFileHeader.h" namespace NSeis { //仅是为了使声明函数中的参数定义清晰, #define OUT //标识其为输出参数 #define IN //标识其为输入参数 // 地震剖面元素ID号定义,为了与其它图形元素不冲突,设定其从200开始 enum ESeisID { idIndex2D = 200 , //2D地震剖面索引 idIndex3D //3D地震剖面索引 }; class AFX_EXT_CLASS CSeisIndexPoint { public: CSeisIndexPoint(){posFile=-1;} CPoint2D coor; //线道号对应的坐标 CRowCol rowcol; //线道号 __int64 posFile; //文件位置 bool operator == (CSeisIndexPoint& sp) const; }; class AFX_EXT_CLASS CSeisSampleInfo { public: CSeisSampleInfo(); //使用参数CSeisFileHeader对象初始化采样信息 void Initialize(CSeisFileHeader& fh); /** @brief 获得总采样点个数 */ unsigned short GetTotalSampleNumber() { return sample_num; } /** @brief 获得格式代码 */ CFileSegy::EDataType& GetFormatCode() { return dataType; } /** @brief 获得采样间隔 */ float GetSampleInterval() { return sample_interval * 0.001f; } /** @brief 获得一个采样点的字节长度 */ int GetOneSampleBytes() { return CFileSegy::SizeofDataType(dataType); } /** @brief 获得一道数据的字节长度 */ int GetTotalSampleBytes() { return GetOneSampleBytes()*GetTotalSampleNumber(); } void Write(CFile& fw, const short& ver); int Read(CFile& fr, const short& ver); void Serialize(CArchive& ar, const short &ver); ///////////////////////////////////////////////////////////////////////////////////// //时间范围设置,缺省为全部 void InitRange(); float GetStartTime() { return m_dataRange.start * GetSampleInterval(); } float GetStopTime() { return m_dataRange.stop * GetSampleInterval(); } TInterval& GetTimeRange() { return m_dataRange; } TInterval GetTimeRangeF(); //设置开始结束时间,这样读取时仅读取指定范围内的采样点,内部将转换为采样点 //在设置CSeisIndexLine2D索引后 void SetTimeRange(TInterval& range); //参数为时间值,内部将转换为采样点索引号 void SetTimeRange(TInterval& range); //参数为采样点索引号 void SetTimeRange(int start, int stop); //参数为采样点索引号 void SetTimeRange(float start, float stop); //参数为时间值 //是否是使用整道数据, 根据m_dataRange参数判断 bool IsFullyTraceData(); //获得显示样点数 unsigned short GetCustomSampleNumber() { return m_dataRange.width()+1; } /** @brief 获得一道显示数据的字节长度 */ int GetCustomSampleBytes() { return GetOneSampleBytes()*GetCustomSampleNumber(); } //剖面显示的开始结束时间,在使用时将根据采样点间隔转换为整采样点索引值, //如果全部为0或小于0的数时,剖面将按照全部显示 TInterval m_dataRange; //采样点范围,>=0 <采样点总个数 //////////////////////////////////////////////////////////////////////////////////// //读写地震道数据时是否将字节顺序反转 BOOL IsSwap() { return m_bSwap; } void EnableSwap(BOOL bEnable) { m_bSwap = bEnable; } ///////////////////////////////////////////////////////////////////////////////////// /** @brief 采样间隔,按照微秒保存,使用时需要*0.001(转换为毫秒) */ unsigned short sample_interval; unsigned short sample_num; //每道数据的采样点个数 CFileSegy::EDataType dataType; //道数据类型 protected: BOOL m_bSwap; //读写SegY文件时是否反转字节 }; }//namespace using namespace NSeis;