////////////////////////////////////////////////////////////////////////////// //文件: 三维体文件操作类 //主要功能: // //程序编写: 2011-5-3 // // ///////////////////////////////////////////////////////////////////////////// #pragma once #include "BuilderBase.h" #include "SeisLineData.h" namespace NCube { //将三维体数据(F(X,Y)文件,一般保存速度体数据)构建成线道号与坐标对应方式 //线道号以索引号0开始,以网格数-1结束 //主要是为了解决坐标直接进行计算会超界的问题 class AFX_EXT_CLASS CBuilderMesh3D : public CBuilderBase { public: CBuilderMesh3D(void); ~CBuilderMesh3D(void); //直接读取加载三维体数据 bool Read(CString strFxyPathName); //加载三维体文件 //绑定三维体文件 virtual bool AttachInput(void* pMesh, bool bAutoDelete = false); //参数为CDimension3D对象 virtual void Clear(void); virtual float GetSampleInterval(); //获得采样间隔,为了写SegY剖面时使用 //获得三维体中的指定点的数据值 virtual double Value(double x, double y, double z) { return GetCube()->Value(x, y, z); } virtual double Value(int row, int col, int k) { return GetCube()->Value(row, col, k); } virtual CColorBase& GetColorBar() { return m_colorBar; } virtual CSeisSampleInfo& GetSampleInfo() { return m_sampleInfo; }//获得采样点信息 ///////////////////////////////////////////////////////////////////////////////////////// //输出结果为实际坐标 // //生成不规则切片 bool CreateRandMesh_XY(CMeshRand2D& md, CCurve* pCurveXY, EOrientation curOri); bool CreateRandMesh_XY(CMeshRand2D& md, CCurve* pCurve, float fiexdStep, EOrientation curOri);//指定步长 //线道号将根据areaSnapStep状态是否进行取整 bool CreateLineXY(CMesh2D& md, float line, EOrientation ori, bool bReMemory=true); // 读取一条主测线地震剖面 bool CreateInlineXY(CMesh2D& md, float row_line_num, bool bReMemory=true); // 读取一条联络测线地震剖面 bool CreateCrosslineXY(CMesh2D& md, float col_line_num, bool bReMemory=true); // 读取一条等时切片 bool CreateSliceUpXY(CMesh2D& md, float slice_up_num, bool bReMemory=true); ///////////////////////////////////////////////////////////////////////////////////////// CDimension3D* GetCube() { return (CDimension3D*)GetInput(); } virtual CSeisSurvey3D& GetSurvey() { return m_survey; } CSeisSurvey3D m_survey; //测网等信息 CColorBase m_colorBar; protected: void InitSampleInfo(); //初始化体采样点信息,必须在绑定体之后 CSeisSampleInfo m_sampleInfo; //体的采样点信息,为了与地震剖面的统一 private: //仅是为了使用线程定义 CString m_strMeshFile; //仅是为了使用线程读取数据体文件 void MeshXY2MeshRC(double* bakXY6); //将实际坐标网格体转换为线道号网格体,为了与地震数据体统一 void MeshRC2MeshXY(double* bakXY6); //将线道号体转换为实际坐标体 protected: virtual bool CreateData(); //不使用线程方式 private: //不使用线程方式 bool _ReadFile(LPCTSTR lpszMeshFile); //加载数据体网格 //输入参数dCurLine与line变量为线道号 bool _CreateLine(CSeisLineData& sd, float line, EOrientation ori, bool bReMemory); //bool _CreateSeisDataAny(CSeisLineData& sd, float& dCurLine, EOrientation ori); bool _CreateSeisDataSnap(CSeisLineData& sd, float& dCurLine, EOrientation ori); //根据定义的曲线生成不规则剖面,曲线为XY平面的线道号坐标 bool _CreateRandLineRC(OUT CSeisLineData& sd, CCurve* pCurve); //根据定义的曲线生成不规则剖面,曲线为XY平面的实际坐标 bool _CreateRandLineXY(OUT CSeisLineData& sd, CCurve* pCurve); //输出结果为线道号坐标 bool _CreateCube(CDimension3D& cb, CCubeRange& cr, bool bReMemory=true); bool _CreateRandMeshRC(CMeshRand2D& md, CCurve* pCurve, EOrientation curOri);//自动步长 bool _CreateRandMeshXY(CMeshRand2D& md, CCurve* pCurve, EOrientation curOri);//生成不规则切片 bool _CreateSliceRC(CMesh2D& md, CDimension2D* pInSuf, bool bLineValue); bool _CreateSliceRC(CMesh2D& md, float& z_value, bool bLineValue); //输出结果为实际坐标,输入参数为实际坐标 bool _CreateSliceXY(CMesh2D& md, CDimension2D* pInSuf, bool bLineValue); bool _CreateRandMesh_XY(CMeshRand2D& md, CCurve* pCurveXY, EOrientation curOri); bool _CreateRandMesh_XY(CMeshRand2D& md, CCurve* pCurve, float fiexdStep, EOrientation curOri);//指定步长 bool _CreateMeshData(CMesh2D& md, float& dCurLine, EOrientation ori); //生成三方向切片 bool _CreateMeshDataAny(CMesh2D& md, float& dCurLine, EOrientation ori); //插值生成三方向切片 bool _CreateMeshDataSnap(CMesh2D& md, float& dCurLine, EOrientation ori); //根据网格节点(整步长)生成三方向切片 }; }//namespace