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.

272 lines
8.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-11-29
//
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "AttachBase.h"
#include "BuilderBase.h"
#include "RowColRange.h"
namespace NSeis
{
//需要绑定一个CBuilderBase对象
class AFX_EXT_CLASS CSeisBox : public CAttachBase
{
public:
CSeisBox(void);
~CSeisBox(void);
//指针仅是指向,内部不进行删除
CBuilderBase* GetBuilder() { return (CBuilderBase*)GetInput(); }
CSeisSurvey3D& GetSurvey() { return GetBuilder()->GetSurvey(); }
void Clear();
void operator = (CSeisBox& id);
bool CreateCubeSection(int nMode); //nMode=1,六面体, nMode=2为交叉剖面
//将所有剖面及切片颜色设置为指定颜色,并重新生成材质
bool CreateTexture(CColorBase& cb, int nBPP);
bool CreateTexture();
////////////////////////////////////////////////////////////////////////////
//Create函数中返回int值为生成结果在列表中的索引号-1表示生成失败
/////////////////////////////////////////////////////////////////////////////
//生成切片或剖面,输出结果为线道号坐标内部存储对象为CMeshRand2D
//EOrientation方向可以为主测线、联络测线、切片三个方向
// 根据定义的曲线生成不规则切片或剖面,曲线为线道号坐标
int CreateRandMeshRC(IN CCurve* pCurve, EOrientation curOri);
// 根据定义的曲线生成不规则切片或剖面,曲线为实际坐标
int CreateRandMeshXY(IN CCurve* pCurve, EOrientation curOri);
/////////////////////////////////////////////////////////////////////////////
//生成切片内部存储对象为CMesh2D
// 获得等时切片,输出结果为线道号坐标
int CreateSliceUp(float z_value, bool bLineValue = false);
// 根据解释层位等数据读取不等时切片,输入的曲面中坐标为线道号
// dn输出曲面坐标为线道号
// pInsuf输入曲面坐标为线道号
int CreateSliceRC(IN CDimension2D* pInSuf, bool bLineValue = true);
// 根据解释层位等数据读取不等时切片,输入的曲面中坐标为实际坐标
// dn输出曲面坐标为实际坐标
// pInsuf输入曲面坐标为实际坐标
int CreateSliceXY(IN CDimension2D* pInSuf, bool bLineValue = true);
/////////////////////////////////////////////////////////////////////////////
//生成不规则测线剖面内部存储对象为CSeisLineData
// 根据定义的曲线生成不规则剖面曲线为XY平面的线道号坐标
int CreateRandLineRC(IN CCurve* pCurve);
// 根据定义的曲线生成不规则剖面曲线为XY平面的实际坐标
int CreateRandLineXY(IN CCurve* pCurve);
//////////////////////////////////////////////////////////////////////////////////////////
//线道号将根据areaSnapStep状态是否进行取整
//读取一条主测线地震剖面
int CreateInline(float row_line_num, bool bReMemory = true);
//读取一条联络测线地震剖面
int CreateCrossline(float col_line_num, bool bReMemory = true);
// 重新计算内部线道号和时间
void CalculateItem(CCubeRange& ro,CCubeRange& rn);
void SetCubeRange(CCubeRange& range) { m_range = range; }
CCubeRange& GetCubeRange() { return m_range; }
bool WriteSegy(LPCTSTR lpszFileName); //根据当前指定的范围写子体
//////////////////////////////////////////////////////////////////////////////////////
//> start
//> 切片中涉及到的类型,为了保存设置信息
enum ESectionType
{
modeNone = 0,
modeInline = 1, ///< 主测线剖面
modeCrossLine, ///< 联络线剖面, 指针为CSeisLineData对象
modeSlice, ///< 等时切片
modeSurfaceSlice, ///< 沿层切片, 指针为CMesh2D对象
modeRandomLine, ///< 任意线剖面, 指针为CSeisLineData对象
modeRandomSlice, ///< 任意线切片, 指针为CMeshRand2D对象也可以为剖面方向
};
//////////////////////////////////////////////////////////////////////
//基础类型
class AFX_EXT_CLASS CSectionItem : public CAttachBase
{
public:
CSectionItem(CSeisBox* pParentList)
{
SetParentList(pParentList);
m_type = modeNone;
m_pTexture = NULL;
m_nBPP = 32;
}
~CSectionItem(void);
virtual void Clear();
virtual bool CreateTexture() { return false; }
virtual CTexture* GetTexture() { return m_pTexture; }
virtual bool RecreateSection() { return m_pParentList->RecreateSection(this); }
//获得曲面绑定的曲线空间坐标
virtual bool GetCurveCoordRC(CCurve& cv, bool bIsMaxRange) { return false; }
void SetParentList(CSeisBox* pParentList) { m_pParentList = pParentList; }
void operator = (CSectionItem& si);
ESectionType m_type;
CColorBase m_colbar;
int m_nBPP;
CTexture* m_pTexture;
CSeisBox* m_pParentList;
};
//克隆一个新元素对象,返回其指针,需要在外部删除
int GetCount() { return m_sections.size(); }
CSectionItem* CloneItem(IN CSectionItem* pItem);
CSectionItem* GetAt(int nIndex) { return m_sections[nIndex]; }
CSectionItem* operator[] (int nIndex) { return m_sections[nIndex]; }
void RemoveAt(int nIndex);
void Remove(CSectionItem* pItem);
bool IsEmpty();
//使用其内部的参数重新生成所有剖面
bool RecreateSection(void);
//根据指定索引,使用其内部的参数重新生成剖面
bool RecreateSection(int nIndex);
//使用指定的参数的剖面信息重新生成剖面,一般情况下是在其参数修改后调用
bool RecreateSection(CSectionItem* pItem);
virtual int AfterCreate(CSectionItem* pItem); //返回在数组中的索引号
//获得指定项显示曲面的最大最小值
bool GetItemMaxMin(CSectionItem* pItem, double& dmin, double& dmax);
//////////////////////////////////////////////////////////////////////////////////////////////
//其它类型
class AFX_EXT_CLASS CSectionItemLine : public CSectionItem
{
public:
CSectionItemLine(CSeisBox* pParentList);
CSeisLineData* GetData(){ return (CSeisLineData*)GetInput(); }
EOrientation GetOrientation() { return GetData()->GetOrientation(); }
//获得曲面绑定的曲线空间坐标
virtual bool GetCurveCoordRC(CCurve& cv, bool bIsMaxRange);
virtual void Clear();
virtual bool CreateTexture();
void operator = (CSectionItemLine& id);
float line_value; //主测线或联络测线号
};
class AFX_EXT_CLASS CSectionItemRandLine : public CSectionItemLine
{
public:
CSectionItemRandLine(CSeisBox* pParentList);
virtual void Clear();
void operator = (CSectionItemRandLine& id);
//获得曲面绑定的曲线空间坐标
virtual bool GetCurveCoordRC(CCurve& cv, bool bIsMaxRange);
CCurve* m_pCurve; //保存原始定义的曲线
};
class AFX_EXT_CLASS CSectionItemSlice : public CSectionItem
{
public:
CSectionItemSlice(CSeisBox* pParentList);
CMesh2D* GetData() { return (CMesh2D*)GetInput(); }
virtual bool CreateTexture();
virtual void Clear();
void operator = (CSectionItemSlice& id);
//获得曲面绑定的曲线空间坐标
virtual bool GetCurveCoordRC(CCurve& cv, bool bIsMaxRange);
float zslice_value; //为等时切片时的时间值,沿层切片不使用该参数
bool m_bLineValue;
};
class AFX_EXT_CLASS CSectionItemSurfaceSlice : public CSectionItemSlice
{
public:
CSectionItemSurfaceSlice(CSeisBox* pParentList);
virtual void Clear();
void operator = (CSectionItemSurfaceSlice& id);
//需要单独处理
//获得曲面绑定的曲线空间坐标
virtual bool GetCurveCoordRC(CCurve& cv, bool bIsMaxRange) { return false; }
//仅是指向
CDimension2D* m_pSurface;
};
class AFX_EXT_CLASS CSectionItemRandSlice : public CSectionItem
{
public:
CSectionItemRandSlice(CSeisBox* pParentList);
virtual bool CreateTexture();
//获得曲面绑定的曲线空间坐标
virtual bool GetCurveCoordRC(CCurve& cv, bool bIsMaxRange);
virtual void Clear(void);
CMeshRand2D* GetData() { return (CMeshRand2D*)GetInput(); }
void operator = (CSectionItemRandSlice& id);
CCurve* m_pCurve;
EOrientation m_ori;
};
//> stop
//////////////////////////////////////////////////////////////////////////////////////
protected:
TObjectSet<CSectionItem> m_sections; //生成的所有剖面或切片
CCubeRange m_range; //体范围,所有剖面或切片所在的最大最小范围
};
//体管理,包括整个体及子体的管理
class AFX_EXT_CLASS CSeisCubeSet
: public TObjectSet<CSeisBox>
, public CAttachBase
{
public:
CSeisCubeSet();
virtual ~CSeisCubeSet();
//输入pInput指针可是指向也可内部自动删除
virtual bool AttachInput(void* pBuilderBase, bool bAutoDelete = false);
virtual void Clear();
CBuilderBase* GetBuilder() { return (CBuilderBase*)GetInput(); }
CSeisSurvey3D& GetSurvey() { return GetBuilder()->GetSurvey(); }
//nMode=0不生成剖面
//nMode=1六面体,
//nMode=2为交叉剖面
int CreateCube(int nMode); //自动建立一个全范围体
int CreateCube(CCubeRange range, int nMode);//生成子体,返回索引号
};
}//namespace