////////////////////////////////////////////////////////////////////////////// //文件: 三维SegY文件索引绑定类 //主要功能: // 为了所有操作三维体文件的派生类 // 完成对数据体进行切剖面、切片、子体的功能 //程序编写: 2011-8-31 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include "AttachBase.h" #include "SeisSurvey3D.h" #include "ProgressThreadBase.h" #include "MeshRand2D.h" #include "SeisLineData.h" namespace NSeis { /////////////////////////////////////////////////////////////////////// class AFX_EXT_CLASS CBuilderBase : public CAttachBase , public CProgressThreadBase { public: CBuilderBase(void); virtual ~CBuilderBase(void); virtual void Clear(void); //获得三维体中的指定点的数据值 virtual double Value(double x, double y, double z)=0; virtual double Value(int row, int col, int k)=0; ///////////////////////////////////////////////////////////////////////////// //读取并生成三维体,输出为线道号坐标 bool CreateCube(OUT CDimension3D& cb, IN CCubeRange& cr, bool bReMemory = true); ///////////////////////////////////////////////////////////////////////////// //生成切片或剖面,输出结果为线道号坐标 //EOrientation方向可以为主测线、联络测线、切片三个方向 // 根据定义的曲线生成不规则切片或剖面,曲线为线道号坐标 bool CreateRandMeshRC(OUT CMeshRand2D& md, IN CCurve* pCurve, EOrientation curOri); // 根据定义的曲线生成不规则切片或剖面,曲线为实际坐标 bool CreateRandMeshXY(OUT CMeshRand2D& md, IN CCurve* pCurve, EOrientation curOri); ///////////////////////////////////////////////////////////////////////////// //生成不规则测线剖面 // 根据定义的曲线生成不规则剖面,曲线为XY平面的线道号坐标 bool CreateRandLineRC(OUT CSeisLineData& md, CCurve* pCurve); // 根据定义的曲线生成不规则剖面,曲线为XY平面的实际坐标 bool CreateRandLineXY(OUT CSeisLineData& md, CCurve* pCurve); ///////////////////////////////////////////////////////////////////////////// //生成切片 // 获得等时切片,输出结果为线道号坐标 bool CreateSliceUp(OUT CMesh2D& dn, float z_value, bool bLineValue = false); // 根据解释层位等数据读取不等时切片,输入的曲面中坐标为线道号 // dn:输出曲面,坐标为线道号 // pInsuf:输入曲面,坐标为线道号 bool CreateSliceRC(OUT CMesh2D& dn, IN CDimension2D* pInSuf, bool bLineValue = true); // 根据解释层位等数据读取不等时切片,输入的曲面中坐标为实际坐标 // dn:输出曲面,坐标为实际坐标 // pInsuf:输入曲面,坐标为实际坐标 bool CreateSliceXY(OUT CMesh2D& dn, IN CDimension2D* pInSuf, bool bLineValue = true); ////////////////////////////////////////////////////////////////////////////////////////// //线道号将根据areaSnapStep状态是否进行取整 bool CreateLine(OUT CSeisLineData& sd, float line, EOrientation ori, bool bReMemory = true); //读取一条主测线地震剖面 bool CreateInline(OUT CSeisLineData& sd, float row_line_num, bool bReMemory = true); //读取一条联络测线地震剖面 bool CreateCrossline(OUT CSeisLineData& sd, float col_line_num, bool bReMemory = true); virtual CSeisSampleInfo& GetSampleInfo() = 0; virtual float GetSampleInterval() = 0; //获得采样间隔,为了写SegY剖面时使用 virtual CColorBase& GetColorBar() = 0; virtual CSeisSurvey3D& GetSurvey() = 0; virtual bool CreateData()=0; //不使用线程方式 virtual bool DoThreadWork(); //执行线程处理的工作 //设置/获得 剖面时间显示范围,设置显示范围时必须在InitWithIndex初始化完成后 // 参数为时间值,内部将转换为采样点索引号 virtual void SetRangeZ(TInterval& range); // 参数为采样点索引号 virtual void SetRangeZ(TInterval& range); virtual TInterval GetRangeZI(); virtual TInterval GetRangeZF(); bool IsWork() { return GetSurvey().IsWork(); } bool IsSnapStep() { return GetSurvey().IsSnapStep(); } void EnableWork(bool bWork) { GetSurvey().EnableWork(bWork); } void EnableSnapStep(bool bSnap) { GetSurvey().EnableSnapStep(bSnap); } double GetScaleFactor() { return m_seisLinePar.m_dScaleFactor; } CSeisLinePar& GetSeisLinePar() { return m_seisLinePar; } enum ECubeType //体类型 { cubeErr = 0, //无效体数据 cubeMesh = 1, //CDimension3D体网格对象 cubeSeis //三维地震数据体对象 }; ECubeType GetCubeType() { return m_cubeType; } protected: void SetCubeType(ECubeType ct) { m_cubeType = ct; } ECubeType m_cubeType; CSeisLinePar m_seisLinePar; //剖面扩展参数 protected: enum EType { //全部使用 typeError = 0, typeInline = 1, //输出CSeisLineData对象,规则主测线, 输出为地震剖面CSeisData对象 typeCrossline = 2, //输出CSeisLineData对象,规则联络测线, 输出为地震剖面CSeisData对象 typeSliceUp = 3, //输出CMesh2D对象,等时切片,曲线为线道号坐标 typeRandLineRC = 4, //输出CSeisLineData对象,根据曲线生成不规则剖面,曲线为线道号坐标 typeRandLineXY = 5, //输出CSeisLineData对象,根据曲线生成不规则剖面,曲线为实际坐标 typeCube = 6, //输出CDimension3D对象,子体 typeRandMeshRC = 7, //输出CMeshRand2D对象,根据曲线生成不规则切片或剖面,曲线为线道号坐标 typeRandMeshXY = 8, //输出CMeshRand2D对象,根据曲线生成不规则切片或剖面,曲线为实际坐标 typeSliceMeshRC = 9, //输出CMesh2D对象,根据曲面生成不等时切片,输入的曲面为线道号坐标,输出曲面为线道号坐标 typeSliceMeshXY = 10, //输出CMesh2D对象,根据曲面生成不等时切片,输入的曲面为实际坐标,输出曲面为实际坐标 //仅在CBuilderMesh3D中使用 typeLoadFile = 11, //加载文件 typeMeshInline = 12, //输出CMesh2D对象,规则主测线, 输出为剖面CMesh2D对象, 输出为实际坐标 typeMeshCrossline = 13, //输出CMesh2D对象,规则联络测线, 输出为剖面CMesh2D对象, 输出为实际坐标 typeMeshSliceUp = 14, //输出CMesh2D对象,等时切片, 输出为剖面CMesh2D对象, 输出为实际坐标 typeRandLineFixed = 15, //输出CMeshRand2D对象,生成固定步长不规则剖面 typeRandLine_XY = 16, //输出CMeshRand2D对象,根据曲线生成不规则切片或剖面,曲线为实际坐标,输出结果为实际坐标 //仅在CSeisBuilder3D中使用 typeIndexLine = 20, //输出CSeisLineData对象,任意索引测线 typeIndexRandLine = 21 //输出CSeisLineData对象,根据CSeisIndexRandomLine对象生成任意线剖面 }; ///////////////////////////////////////////////////////////////////////////// //仅是为了使用线程定义 //由以下两个参数确定如何形成切片 EType m_nType; //调用哪个函数 EOrientation m_curOrientation; //当前计算的平面的方向 float m_fCurLine; //当前计算的主测线或联络测线或切片号 bool m_bReMemory; void* m_pOutData; void* m_pOtherData; CCubeRange m_cubeRange; }; }//namespace