|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
//文件: 三维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<float>& range);
|
|
|
// 参数为采样点索引号
|
|
|
virtual void SetRangeZ(TInterval<int>& range);
|
|
|
virtual TInterval<int> GetRangeZI();
|
|
|
virtual TInterval<float> 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
|