#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 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 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& outPt); //获得输入两个点的Y之间的断层线上的点,且按照从pt1到pt2的方向排列 void GetFaultPtByY(dfPoint pt1 , dfPoint pt2,std::vector& 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