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.

142 lines
4.8 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.

#ifndef FAULT_H
#define FAULT_H
#pragma once
//#include "BendObj.h"
class CBendObj;
//////////////////////////////////////////////////////////////////////////////
//文件 Fault.h
//主要功能:
// 多井地层对比断层类
/////////////////////////////////////////////////////////////////////////////
//断层与层位中线的交点信息结构
struct FaultOnBendCrossStruct
{
CBendObj* pBend; //bend层指针
int nBendID;
double fLThrow; //左距离
double fRThrow; //右距离
CPoint2D LeftCrossPt;//左层交点
CPoint2D RightCrossPt;//右层交点
CString bendLeftWell;
CString bendRightWell;
int bendLeftLayerID;
int bendRightLayerID;
public:
FaultOnBendCrossStruct()
{
pBend = NULL;
nBendID = -1;
bendLeftLayerID = -1;
bendRightLayerID = -1;
}
void Serialize(CArchive& ar, const short &ver);
};
typedef CArray<FaultOnBendCrossStruct, FaultOnBendCrossStruct> FAULTONBENDCROSSARR; //断层结构数组
class AFX_EXT_CLASS CFaultObj : public CWellBaseObj
{
public:
CFaultObj(void);
~CFaultObj(void);
void operator=(const CFaultObj& faultObj);
public:
CPointArr m_ptArr; //断层控制点数组
double m_fLeftThrow; //断层左侧上升 ,左侧是正数表示左侧地层上升。
double m_fRightThrow; //断层右侧下降,右侧是正数表示右侧地层是下降
CString m_strName; //断层名
FAULTONBENDCROSSARR m_ptCrossArr; //断层与层位中线的交点数组,(控制层位与断层的交点和断距时使用)
std::vector<dfPoint> m_OrgCtrlPts; //初始控制点
protected:
DWORD m_nFaultFlags; // 断层开关状态
// 连层类Flags
enum FaultFlags
{
FlagNULL = 0x0000, // 空白
FaultFlagBSPline = 0x0001, // 是否绘制B样条曲线
FaultFlagCutOffShoot = 0x0002, // 是否屏蔽分支层
FaultFlagCutExtend = 0x0004, // 是否屏蔽延伸层
FaultFlagCutFluid = 0x0008, // 封堵流体
FaultFlagCutLitho = 0x0010, // 分割岩性
FaultFlagCutLeftExtend = 0x0020, // 切断左延伸层
FaultFlagCutRightExtend = 0x0040, // 切断右延伸层
FaultFlagHideLeftBends = 0x0080, // 隐藏左侧连层
FaultFlagHideRightBends = 0x0100, // 隐藏右侧连层
FaultFlagShowLeftArrow = 0x0200, // 显示左侧箭头
FaultFlagShowRightArrow = 0x0400, // 显示右侧箭头
};
public:
virtual void Serialize(CArchive& ar, const short &ver);
virtual void Draw(CXyDC* pDC);
virtual void MoveTo(CRect8& position);
virtual void MoveHandleTo(int nHandle, CPoint2D point);
virtual void GetRange(CRect8& range);
virtual int HitTest(CPoint2D point, double dHandleSize, BOOL bSelected);
virtual BOOL Intersects(const CRect8& rect, double dHandleSize);
virtual int GetHandleCount();
virtual CPoint2D GetHandle(int nHandle);
int GetCrossCount();
void FaultReCut(int fPtThrowNum=0,double *pfptThrowArr = NULL);//计算断层线切割时,是否有断层线上每段的断距
void FaultReCut_ResForm();
void ReComputeBendCrossControl(int nHandle,CPoint2D pt,CPoint2D ptDrag,BOOL bAdjustThrow,double dH=0.0);
//开关变量值
virtual void SetFaultFlags(DWORD flags);
virtual void SetBSPline(BOOL bFlag);
virtual void SetCutOffShoot(BOOL bFlag);
virtual void SetCutExtend(BOOL bFlag);
virtual void SetCutFluid(BOOL bFlag);
virtual void SetCutLitho(BOOL bFlag);
virtual void SetHideLeftBends(BOOL bFlag);
virtual void SetHideRightBends(BOOL bFlag);
virtual void SetShowLeftArrow(BOOL bFlag);
virtual void SetShowRightArrow(BOOL bFlag);
virtual void SetCutLeftExtend(BOOL bFlag);
virtual void SetCutRightExtend(BOOL bFlag);
virtual DWORD GetFaultFlags();
virtual BOOL IsBSPline();
virtual BOOL IsCutOffShoot();
virtual BOOL IsCutExtend();
virtual BOOL IsCutFluid();
virtual BOOL IsCutLitho();
virtual BOOL IsHideLeftBends();
virtual BOOL IsHideRightBends();
virtual BOOL IsShowLeftArrow();
virtual BOOL IsShowRightArrow();
virtual BOOL IsCutLeftExtend();
virtual BOOL IsCutRightExtend();
void Transform(CXyDC* pDC, float* matrix, BOOL bUndo);
public:
void GetFaultPtOrderbyPt1ToPt2(dfPoint pt1, dfPoint pt2, std::vector<dfPoint>& outPt); //获得输入两个点的Y之间的断层线上的点且按照从pt1到pt2的方向排列
void GetFaultPtByY(dfPoint pt1 , dfPoint pt2,std::vector<dfPoint>& outPt); //获得输入两个点的Y之间的断层线上的点且按照从到小排列
void GetFaultPtsByDec(CPointArr& ptArr);//按照Y方向由大变小
virtual int ReadPCG(CFile &fr,const short& ver);
virtual void WritePCG(CFile &fw,int nBaseTabNum); //pcg文件
int ReadPCG_FaultPoints(CFile &fr,CXmlParse& xp,const short& ver);
//输入层位交点,及左右滑动断距, 得到左右层位与断层的交点
void GetFaultPointByThrow(dfPoint intsectPt, double lthrow, dfPoint& lPoint);
void GetFaultPointByYOffset(dfPoint intsectPt, double yOffset, dfPoint& lPoint); //将一个点沿着断层线移动,纵坐标变化是yoffset
protected:
void GetBendFaultCross(CPointArr& ptArrCurve,void *pFaultCross,BOOL & bCross,int& FptId); //FptId是与层位线相交的断层线点ID
public:
virtual int ReadPCG(CKXmlParse& xp, const short& ver);
int ReadPCG_FaultPoints( CKXmlParse& xp, const short& ver);
};
#endif