You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
6.2 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//////////////////////////////////////////////////////////////////////////////
//文件: 三维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