////////////////////////////////////////////////////////////////////////////// //文件: SegY文件操作类 //主要功能: // //程序编写: 2011-4-1 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include "SeisSampleInfo.h" #include "SeisSurvey2D.h" namespace NSeis { ///////////////////////////////////////////////////////////////////////////////////// //2D数据体的线定位信息,每一条CLineData为一条线 class AFX_EXT_CLASS CSeisIndexLine2D { public: CSeisIndexLine2D(); ~CSeisIndexLine2D(); bool NextTrace(int& col); //获得下一道的道号,也就是增加了一个步长 bool PrevTrace(int& col); //获得上一道的道号,也就是减少了一个步长 bool GetIndexPoint(int col, OUT CSeisIndexPoint& gp); //根据道号获得坐标及文件定位 CPoint2D GetCoordinate(int col); //根据道号插值坐标,该道号可以不在曲线道号范围内 int GetCoorCount(); //获得坐标点个数 int GetCoordinate(CPointList& dp); //获得坐标点,点中L为道号 int GetSurveyCurve(CSurveyLine* pCurve); //获得测线,包括坐标、桩号、名称等值 //根据参数测线重置索引中的坐标,该曲线中必须有桩号L,索引中的桩号必须与之匹配 int MatchingCoordinate(CCurve* pInCurve); int size() const { return segments.size(); } //返回线段的个数 int GetTraceCount() const; //获得总道数 bool GetRange(TInterval& range) const; //获得道号范围 int GetRange(CRect8& range); //获得坐标范围,返回参与运算的点个数 CSeisSampleInfo& GetSampleInfo(){ return m_sampleInfo; } void WriteDFD(CFile& fw); //将inline测线保存为DFD文件,以便检查是否正确 void Write(CFile& fw, const short& ver); int Read(CFile& fr, const short& ver); void Serialize(CArchive& ar, const short &ver); //对二维测线坐标进行数据冗余,为了减少内在占用及提高加载速度 void CoorRedundant(double dError = 1e-3); void operator=(CSeisIndexLine2D& sl); /////////////////////////////////////////////////////////////////////////////////////// class AFX_EXT_CLASS CSegment2D : public TIntervalStep { public: //可以有任意多个坐标点,坐标中的z值是对应的道号 TTypeSet coors; //每道的坐标集合,其中Z值是与坐标相对应的道号,这样坐标个数可以是>=2的任意个数 TIntervalStep<__int64> m_pos; //对应道号在文件中的位置, //根据道号获得坐标及文件定位 bool GetIndexPoint(int col, OUT CSeisIndexPoint& gp); //根据道号获得坐标 void GetPointWithIndex(int nIndex, OUT CSeisIndexPoint& gp); //根据坐标索引获得坐标 int GetRange(CRect8& range); //获得坐标范围 int GetCoorCount(); //获得坐标点个数 int GetCoordinate(CPointList& dp); //获得坐标点,点中l为道号 inline void operator=(CSegment2D& sg) { *(TIntervalStep*)this = *(TIntervalStep*)&sg; m_pos = sg.m_pos; coors = sg.coors; } }; //////////////////////////////////////////////////////////////////////////////////////// CString m_strFileName; //与该体数据对应的SegY文件 CSeisSampleInfo m_sampleInfo; //地震剖面的采样点信息 CString line_name; //线号 TObjectSet segments; //道的集合,考虑使用CSegment2D仅是为了防止道号间隔不同的情况 }; //管理二维SegY文件中的线道号、坐标及道在文件中的位置,每个剖面是一个CLineData对象 class AFX_EXT_CLASS CSeisIndex2D : public TObjectSet { public: CSeisIndex2D(void); ~CSeisIndex2D(void); int GetRange(CRect8& range); //获得坐标范围,返回参与运算的点个数 int FindLine (LPCTSTR lpszLineName) const; bool GetIndexPoint(LPCTSTR lpszLineName, int col, OUT CSeisIndexPoint& gp); bool GetSurvey2D(CSeisSurvey2D& sd); void WriteDFD(LPCTSTR lpszFileName); //将测线保存为DFD文件,以便检查是否正确 void Write(LPCTSTR lpszFileName); void Write(CFile& fw, const short& ver); int Read(CFile& fr, const short& ver); void Serialize(CArchive& ar, const short &ver); void operator = (CSeisIndex2D& si); }; }//namespace