/************************************************************************************** 主要功能: 曲线基类 主要函数列表: 1 设置曲线对象 virtual void CalculateSize(CPoint2D point); 2 画左右刻度 void DrawTitleLeftAndRightContent(CXyDC* pDC, CString left, CString right, GDFLOGFONT logfont,CRect8 rect, GDFLOGBRUSH brush); 3 画曲线头 virtual void DrawCurveHeadLine(CXyDC* pDC); 4 画曲线头 virtual void DrawTrackHead(CXyDC* pDC); 5 画交互曲线头 virtual void DrawActiveCurveHead(CXyDC* pDC); 6 画曲线内容 virtual void DrawCurve(CXyDC* pDC); 7 画曲线 virtual void DrawCurveLine(CXyDC* pDC,CCurveEx& curve,GDFLOGPEN logpen); 8 画部分曲线 virtual void DrawCurveLineSeg(CXyDC* pDC,CCurveEx& curve,int nStart,int nPoint,GDFLOGPEN logpen); 9 画曲线中的散点 virtual void DrawDot(CXyDC* pDC,CCurveEx& curve); 10 画散点曲线 virtual void DrawDotCurve(CXyDC* pDC,CCurveEx& curve,GDFLOGPEN logpen); 11 画阶梯曲线 virtual void DrawStep(CXyDC* pDC,CCurveEx& curve,GDFLOGPEN logpen); 12 画杆状曲线 virtual void DrawRod(CXyDC* pDC,CCurveEx& curve,CRect8 rect,GDFLOGPEN logpen); 13 画杆状曲线图 virtual void DrawRodCurve(CXyDC* pDC,CCurveEx& curve,CRect8 rect,GDFLOGPEN logpen); 14 曲线的填充 virtual void DrawFillCurve(CXyDC* pDC); 15 画道背景 virtual void DrawFill(CXyDC* pDC); 16 画道格线 virtual void DrawGrid(CXyDC* pDC); **************************************************************************************/ #ifndef TRACKCURVEOBJBASE_H #define TRACKCURVEOBJBASE_H #pragma once #include "InclinedTrack.h" #include "Data/WellDataObj.h" struct DiscretreDataStuct { float depth; float value; }; class AFX_EXT_CLASS CTrackCurveBase : public CInclinedTrack { protected: void Init(); public: CTrackCurveBase(); virtual ~CTrackCurveBase(); CTrackCurveBase(const CRect8& position); CLONE_WELLOBJECT(CTrackCurveBase) virtual void operator=(CTrackCurveBase& object); public: //float* m_curve_value; // 曲线数据 //float* m_curve_depth; // 曲线深度 //int m_sample_count; // 曲线的采样数 int m_nSdep; // 开始深度下标 int m_nEdep; // 结束深度下标 int m_curve_num; // 曲线施工号 CString m_curve_unit; // 曲线单位 double m_fRlev; // 曲线的采样间距 double m_fSdep; // 曲线的起始深度 double m_fEdep; // 曲线的结束深度 int m_width; // 曲线占道宽的百分数 int m_offset; // 曲线的偏移量百分数 double m_curve_left; // 曲线的左刻 double m_curve_right; // 曲线的右刻 double m_fMajorSpace; // 深度主刻度间隔 double m_fMinorSpace; // 深度次刻度间隔 int m_nMajorSpace; // 横向主刻度数 int m_nMinorSpace; // 横向副刻度数 GDFLOGPENEXT m_penMajorGrid; // 主刻网格笔 GDFLOGPENEXT m_penMinorGrid; // 次刻网格笔 GDFLOGFONTEXT m_fontHeadMark; // 刻度字体 GDFLOGPENEXT m_penCurve; // 曲线画笔 GDFLOGPENEXT m_penRod; // 杆状图画笔 GDFLOGPENEXT penDot; // dot笔,不需要保存 double m_dHeadMarkPos; // 图头标注位置 double m_dHeadTitlePos; // 图标题位置 CString m_strFillSymbol; // 充填符号 CString m_strFillSideCurve; // 充填边界曲线名 double m_fFillSideValue; // 充填边界阈值 COLORREF m_fillClr; // 曲线填充颜色 COLORREF m_gradientLeftClr; // 渐变色曲线左颜色 COLORREF m_gradientRightClr; // 渐变色曲线右颜色 COLORREF m_gradientMiddleClr; // 渐变色曲线中间颜色 CString m_strGradientCurve; // 渐变色填充曲线 double m_fGradientLeft; // 渐变色曲线左值 double m_fGradientRight; // 渐变色曲线右值 //曲线散点样式时点参数 COLORREF m_dotBorderClr; // 曲线点边框颜色 COLORREF m_dotFillClr; // 曲线点填充颜色 CSize m_dotSize; // 曲线符号大小 CString m_strDotSymbol; // 曲线点符号名称 //绘制使用 CPoint2D m_ptSide; // 阈值点 CCurveEx m_curve; // 曲线点数据,供斜井使用 CXy* m_pMarkFill; // 曲线填充符号指针 CXy* m_pMarkChart; // 曲线散点符号指针 CColorBase m_gradientClrBar; // 渐变颜色标 std::vector m_ReverseRangeVec; //反卷数值区间,数值的第一个左值是曲线本身的m_right,后面每两个数值一个区间 std::vector m_ReversePenVec;//反卷区间的笔 std::vector m_CurvesVec; // // 曲线点数据 ,直井使用.可以存放多段井曲线数据 std::vector m_CurvesSelectVec; // // 曲线点数据 ,选择使用 BOOL m_bVacuate; //是否抽稀 BOOL m_bCurveRangeAutoSet; // 当从控件中读取曲线数据时,是否要自动计算曲线范围. BOOL m_bCurveAvgGrid;//是否一直绘制均匀网格(不管是否是对数) std::vectorm_fillCurveVecs; //使用曲线填充时生成的闭合多边形片段集合 std::vectorm_fillGradientCurvesVecs;//使用渐进色填充时生成的多边形片段集合。 std::vector m_fillGradientColors; //对应渐进色多边形的颜色集合。 和m_fillGradientCurvesVecs一同管理。 protected: ECurveShowMode m_eCurveShowMode; // 显示方式 DWORD m_nTrackCurveFlags; // 曲线开关状态 DWORD m_nTrackCurveFlagsFill; // 曲线填充状态 DWORD m_nTrackCurveFlagsOld; // 旧版本转化新版本 DWORD m_nTrackCurveFlagsShow; // 曲线显示样式开关 DWORD m_nTrackCurveFlagsBrush; // 充填画刷类型 // 曲线Flags enum TrackCurveFlags { TrackCurveFlagBodyBounds = 0x0001, // 显示边框 TrackCurveFlagTitle = 0x0002, // 显示标题 TrackCurveFlagTrans = 0x0004, // 透明 TrackCurveFlagLog = 0x0008, // 对数 TrackCurveFlagGridX = 0x0010, // 显示横网格 TrackCurveFlagGridY = 0x0020, // 显示纵网格 TrackCurveFlagCover = 0x0040, // 覆盖道 TrackCurveFlagAlone = 0x0080, // 独立道 TrackCurveFlagHeadFill = 0x0100, // 显示头充填 TrackCurveFlagHeadLine = 0x0200, // 显示道头曲线横线 TrackCurveFlagHeadGrid = 0x0400, // 显示头标注 TrackCurveFlagLogMode = 0x0800, // 对数模式 TrackCurveFlagReadOnly = 0x1000, // 只读 TrackCurveFlagCombine = 0x2000, // 组合 TrackCurveFlagHide = 0x4000, // 隐藏 TrackCurveFlagSmooth = 0x10000, // 平滑 //old版本兼容使用 TrackCurveStyleStepOld = 0x8000, // 阶梯风格 TrackCurveStyleRodOld = 0x10000, // 杆状风格 TrackCurveStyleDotOld = 0x20000, // 散点风格 TrackCurveStyleAndCurveOld = 0x40000, // 与曲线组合 TrackCurveStyleDotCurveOld = TrackCurveStyleDotOld | TrackCurveStyleAndCurveOld, // 散点曲线风格 TrackCurveStyleRodCurveOld = TrackCurveStyleRodOld | TrackCurveStyleAndCurveOld, // 杆状曲线风格 TrackCurveStyleFillLeftOld = 0x80000, // 左充填风格 TrackCurveStyleFillRightOld = 0x100000, // 右充填风格 TrackCurveStyleFillCurveOld = TrackCurveStyleFillLeftOld | TrackCurveStyleFillRightOld, // 线间充填 }; //曲线充填类型 enum TrackCurveFlagsFill { TrackCurveStyleFillLeftV = 0x0001, // 左阈值 TrackCurveStyleFillRightV = 0x0002, // 右阈值 TrackCurveStyleFillLeft = 0x0008, // 左边界 TrackCurveStyleFillRight = 0x0010, // 右边界 TraclCurveFlagsFillAll = TrackCurveStyleFillLeftV | TrackCurveStyleFillRightV | TrackCurveStyleFillLeft | TrackCurveStyleFillRight, TrackCurveStyleShowSideCurve = 0x0100, // 显示边界曲线 }; //曲线类型 enum TrackCurveFlagsShow { TrackCurveStyleCurve = 0x0001, //曲线风格 TrackCurveStyleStep = 0x0002, //阶梯风格 TrackCurveStyleRod = 0x0004, //杆状风格 TrackCurveStyleDot = 0x0008, //散点风格 TrackCurveFlagsGridVisible = 0x0010, //GridStyle Visible TrackCurveFlagsStickVisible = 0x0020, //StickStyle Visible }; //画刷类型(颜色、图案、渐变色) enum TrackCurveFlagsBrush { TrackCurveFlagsBrushColor = 0x0001, //颜色充填 TrackCurveFlagsBrushPattern = 0x0002, //图案充填 TrackCurveFlagsBrushVector = 0x0004, //矢量画刷 TrackCurveFlagsBrushGradient = 0x0008, //渐变画刷 TraclCurveFlagsBrushAll = TrackCurveFlagsBrushColor | TrackCurveFlagsBrushPattern | TrackCurveFlagsBrushVector | TrackCurveFlagsBrushGradient, TrackCurveFlagsGradientCurveLog = 0x0010, //渐变色曲线对数刻度 TrackCurveFlagsGradientMidClrAuto = 0x0020, //渐变色,自动中间色 }; public: ECurveShowMode GetCurveShowMode() { return m_eCurveShowMode; } void SetCurveShowMode(ECurveShowMode showMode) { m_eCurveShowMode = showMode; } //设置曲线对象 virtual void CalculateSize(CPoint2D point); //画左右刻度 void DrawTitleLeftAndRightContent(CXyDC* pDC, CString left, CString right, GDFLOGFONT logfont,CRect8 rect, GDFLOGBRUSH brush); //画曲线头 virtual void DrawCurveHeadLine(CXyDC* pDC); //画交互曲线头 virtual void DrawActiveCurveHead(CXyDC* pDC); //画曲线内容 virtual void DrawCurve(CXyDC* pDC); //画曲线 virtual void DrawCurveLine(CXyDC* pDC,CCurveEx& curve,GDFLOGPENEXT logpen); //画部分曲线 virtual void DrawCurveLineSeg(CXyDC* pDC,CCurveEx& curve,int nStart,int nPoint,GDFLOGPENEXT logpen,int Reverse = 0,float xoffet = 0); //画带头尾部分曲线 virtual void DrawCurveLineSeg(int &recursionNum,CXyDC* pDC,CCurveEx& curve,int nStart,int nPoint,GDFLOGPENEXT logpen,BOOL bH,CPoint2D hPt,BOOL bT,CPoint2D tPt,int Reverse = 0,float xoffet = 0,BOOL bMoreReverse = FALSE); //画曲线中的散点 virtual void DrawDot(CXyDC* pDC,CCurveEx& curve); //画散点曲线 virtual void DrawDotCurve(CXyDC* pDC,CCurveEx& curve,GDFLOGPENEXT logpen); //画阶梯曲线 virtual void DrawStep(CXyDC* pDC,CCurveEx& curve,GDFLOGPENEXT logpen); //画杆状曲线 virtual void DrawRod(CXyDC* pDC,CCurveEx& curve,CRect8 rect,GDFLOGPENEXT logpen); //画杆状曲线图 virtual void DrawRodCurve(CXyDC* pDC,CCurveEx& curve,CRect8 rect,GDFLOGPENEXT logpen); // 曲线的填充 virtual void DrawFillCurve(CXyDC* pDC); // 画道背景 已在父类实现 virtual void DrawFill(CXyDC* pDC); // 画道格线 virtual void DrawGrid(CXyDC* pDC); virtual void Draw(CXyDC* pDC); //将计算得到的填充点按照要求换算一下 virtual double GetFillX(int x,CRect8 rect,int leftRightid,BOOL bCut); //重设矩形范围 virtual void ReSetPosition(CRect8 rect); //计算曲线上的所有点数组 virtual void ComputePoints(); virtual void ComputePoints(CRect8 positon) {}; //计算斜井曲线上的所有点数组 virtual void ComputePointsInclined(); //将其他曲线道的值变换到当前曲线道内 double TranformCurvePoint(double x /*变换的点x*/,CRect8 rect/*变换曲线的范围*/); //GetNormalShow 参数说明:blog=是否对数,value=幅度值,rect=曲线区域,返回值=计算得到的坐标点x virtual double GetNormalShow(BOOL blog,double value,CRect8 &rect); //得到正常显示数据 //GetCutShow 参数说明:blog=是否对数,value=幅度值,rect=曲线区域,&bbreak=是否截断,传出参数,返回值=计算得到的坐标点x virtual double GetCutShow(BOOL blog,double value,CRect8 &rect); //得到截断显示数据 //GetNormalShow 参数说明:blog=是否对数,value=幅度值,rect=曲线区域,&Brev=是否反卷,传出参数,返回值=计算得到的坐标点x virtual double GetReverseShow(BOOL blog,double value,CRect8 &rect,BOOL &brev,int &mRevNum); //得到反卷显示数据 //GetNormalShow 参数说明:blog=是否对数,value=幅度值,rect=曲线区域,返回值=计算得到的坐标点x virtual double GetNormalShow(BOOL blog,double value,CRect8 &rect,double left,double right); //得到正常显示数据 virtual int GetHandleCount(); virtual void MoveTo(CRect8& position); virtual void MoveToActiveCurveHead(CRect8& position); virtual void Serialize(CArchive& ar, const short &ver); virtual BOOL Intersects(const CRect8& rect, double dHandleSize); virtual CWellBaseObj* ObjectAt(const CRect8& rect, double dHandleSize, BOOL bNesting=FALSE); virtual BOOL IsInRange(CRect8& range); //老格式转换 virtual void TransformOldToNew(DWORD flags); //根据填充序号得到符号名和背景色(转换老版本) virtual BOOL GetFillMark(int nID, CString& str, COLORREF& clr); virtual void SetPenGrid(GDFLOGPENEXT& penmajor, GDFLOGPENEXT& penminor); virtual void SetFontHeadMark(GDFLOGFONTEXT& font, BOOL bReplaceClr); virtual void SetSpace(double major, double minor); //数据转移 virtual void TransferData(CWellBaseObj* pObj); virtual CWellDataObj* GetDataObj() { return NULL; } virtual void SetDataObj(CWellDataObj* pData, BOOL bCopy=TRUE) {} virtual void GetDataValue(double& dmin, double& dmax) {} //根据深度值获得曲线值 virtual BOOL GetCurveValue(double dDepth, double& dValue, int& nBegin); virtual double GetCurveValue(int index); virtual double GetCurveDepth(int index); virtual int GetDataCount(); //创建渐变颜色标 virtual void MakeGradientColorBar(); virtual BOOL RemoveChild(); //开关变量值 virtual void SetTrackInCurveFlags(DWORD flags); virtual void SetTrackInFillFlags(DWORD flags); virtual void SetTrackInOldFlags(DWORD flags); virtual void SetFillBrush(DWORD flags); virtual DWORD GetTrackInCurveFlags(); virtual DWORD GetTrackInFillFlags(); virtual DWORD GetTrackInOldFlags(); virtual DWORD GetFillBrush(); virtual void SetShowTitle(BOOL bFlag); virtual void SetShowHeadFill(BOOL bFlag); virtual void SetShowHeadLine(BOOL bFlag); virtual void SetTransparent(BOOL bFlag); virtual void SetLog(BOOL bFlag); virtual void SetShowGridX(BOOL bFlag); virtual void SetShowGridY(BOOL bFlag); virtual void SetSmooth(BOOL bFlag); virtual void SetShowGridHead(BOOL bFlag); virtual void SetShowCurve(BOOL bFlag); virtual void SetShowStep(BOOL bFlag); virtual void SetShowRod(BOOL bFlag); virtual void SetShowDot(BOOL bFlag); virtual void SetShowGrid(BOOL bFlag); virtual void SetShowStick(BOOL bFlag); virtual void SetShowFillSideCurve(BOOL bFlag); virtual void SetFillStyleLeft(BOOL bFlag); virtual void SetFillStyleRight(BOOL bFlag); virtual void SetFillStyleLeftV(BOOL bFlag); virtual void SetFillStyleRightV(BOOL bFlag); virtual void SetFillBrushColor(BOOL bFlag); virtual void SetFillBrushPattern(BOOL bFlag); virtual void SetFillBrushVector(BOOL bFlag); virtual void SetFillBrushGradient(BOOL bFlag); virtual void SetGradientCurveLog(BOOL bFlag); // 颜色版不支持log virtual void SetGradientMidClrAuto(BOOL bFlag); virtual BOOL IsShowTitle(); virtual BOOL IsShowHeadFill(); virtual BOOL IsShowHeadLine(); virtual BOOL IsTransparent(); virtual BOOL IsLog(); virtual BOOL IsShowGridX(); virtual BOOL IsShowGridY(); virtual BOOL IsSmooth(); virtual BOOL IsShowGridHead(); virtual BOOL IsShowCurve(); virtual BOOL IsShowStep(); virtual BOOL IsShowRod(); virtual BOOL IsShowDot(); virtual BOOL IsShowGrid(); virtual BOOL IsShowStick(); virtual BOOL IsShowFillSideCurve(); virtual BOOL IsFillStyleLeft(); virtual BOOL IsFillStyleRight(); virtual BOOL IsFillStyleLeftV(); virtual BOOL IsFillStyleRightV(); virtual BOOL IsFillBrushColor(); virtual BOOL IsFillBrushPattern(); virtual BOOL IsFillBrushVector(); virtual BOOL IsFillBrushGradient(); virtual BOOL IsGradientCurveLog(); // 颜色版不支持log virtual BOOL IsGradientMidClrAuto(); void SetFillSymbol(CString name); void ClearCurvesVec(); void ClearCurvesSelectVec(); void ClearFillCurvesVec(); virtual void afterCalculateSize(); void CreateFillCurves(); protected: //画曲线头 virtual void DrawTrackHead(CXyDC* pDC, CRect8 headrect); //绘制斜井曲线充填 void DrawFillCurve_Inclined(CXyDC* pDC); //生成井曲线填充区域,即斜井曲线与井壁形成的闭合区域,存入多边形曲线polygon起始部分为m_curve,bLeft为true表示左闭合多边形,false表示得到右闭合多边形 void GetCurveSolidRegion(CCurve& polygon, bool bLeft); //生成阈值曲线与井壁组成的多边形,存入多边形曲线中,不成功返回false,bool bLeft == true表示左阈值多边形,false为右阈值多边形 bool GetLimenRegion(CCurve& limenRgn, double limenValue,bool bLeft); void DrawOneCurve(CXyDC* pDC,CCurveEx *pCurve,GDFLOGPENEXT &logpen,CRect8& rect,int ii); //画反卷曲线图 virtual void DrawReverseCurve(CXyDC* pDC,CCurveEx& curve,GDFLOGPENEXT& logpen,int &recursionNum); //recursionNums是递归计数,当进行多次递归反卷时计算反卷的次数 virtual void DrawInclineReverseCurve(CXyDC* pDC,CCurveEx& curve); //pOrgPts 是曲线段增加的头尾点所对应的道左边点;0是头点,1是尾点 void DrawInclineCurveLineSeg(CXyDC* pDC,CCurveEx& curve,int nStart,int nPoint,GDFLOGPENEXT logpen,BOOL bH,CPoint2D hPt,BOOL bT,CPoint2D tPt/*,CPoint2D *pOrgPts*/,int Reverse = 0,float xoffet = 0); //void CreateFillCurves(CCurveEx &subCurve, CCurveEx* pFillCurve , CTrackCurveBase* pFillSideCurve1 ,CRect8& trackrect); void CreateFillGradientCurves(); void DrawInclinedTrackGrid(CXyDC* pDC); public: // PCG的读写 //读取PCG一条数据道的信息 //virtual int ReadPCG_Title(CFile &fr,const short& ver); virtual int ReadPCG_SymbolStyle(CXmlParse& xp,const short& ver); virtual int ReadPCG_GridStyle(CXmlParse& xp,const short& ver); virtual int ReadPCG_CurveStyle(CXmlParse& xp,const short& ver); virtual int ReadPCG_StickStyle(CXmlParse& xp,const short& ver); virtual int ReadPCG_Self(CFile &fr,CXmlParse& xp,const short& ver ); virtual int ReadPCG_Trace(CXmlParse& xp,CFile &fr,const short& ver, PCG_TRACECOL& traceCol,int fVerstion); int ReadDml_ReverseData(CFile &fr, CXmlParse& xp, const short& ver); //读取多井曲线道属性 virtual int ReadPCG_TraceSection(CFile &fr,CXmlParse& xp,const short& ver); virtual int ReadPCG_SelfSection(CFile &fr,CXmlParse& xp,const short& ver); virtual int ReadPCG_SelfTraceSection(CFile &fr,CXmlParse& xp,const short& ver); //写pcg格式列模板 virtual void WritePCG_WellColTrace(CFile &fw,int nBaseTabNum); //写pcg格式的道 virtual void WritePCG_Trace(CFile &fw,int nBaseTabNum); //写pcg格式的道 virtual void WritePCG_TraceSection(CFile &fw,int nBaseTabNum); public: // 曲线开始结束点对应的左右边界桩号 double m_dLeftCurveStartL; //曲线开始时对应的左边界桩号 double m_dLeftCurveEndL; //曲线结束时对应的左边界桩号 double m_dRightCurveStartL; //曲线开始时对应的右边界桩号 double m_dRightCurveEndL; //曲线结束时对应的右边界桩号 public: virtual int ReadPCG_SymbolStyle(CKXmlParse& xp, const short& ver); virtual int ReadPCG_GridStyle(CKXmlParse& xp, const short& ver); virtual int ReadPCG_CurveStyle(CKXmlParse& xp, const short& ver); virtual int ReadPCG_StickStyle(CKXmlParse& xp, const short& ver); virtual int ReadPCG_Self( CKXmlParse& xp, const short& ver); virtual int ReadPCG_Trace(CKXmlParse& xp, const short& ver, PCG_TRACECOL& traceCol, int fVerstion); int ReadDml_ReverseData( CKXmlParse& xp, const short& ver); //读取多井曲线道属性 virtual int ReadPCG_TraceSection( CKXmlParse& xp, const short& ver); virtual int ReadPCG_SelfSection(CKXmlParse& xp, const short& ver); virtual int ReadPCG_SelfTraceSection( CKXmlParse& xp, const short& ver); public: void CheckLogLeftRightValue(); }; #endif