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.

443 lines
17 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.

/**************************************************************************************
主要功能:
曲线基类
主要函数列表:
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);
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<float> m_ReverseRangeVec; //反卷数值区间,数值的第一个左值是曲线本身的m_right,后面每两个数值一个区间
std::vector<GDFLOGPENEXT> m_ReversePenVec;//反卷区间的笔
std::vector<CCurveEx*> m_CurvesVec; // // 曲线点数据 ,直井使用.可以存放多段井曲线数据
std::vector<CCurveEx*> m_CurvesSelectVec; // // 曲线点数据 ,选择使用
BOOL m_bVacuate; //是否抽稀
BOOL m_bCurveRangeAutoSet; // 当从控件中读取曲线数据时,是否要自动计算曲线范围.
BOOL m_bCurveAvgGrid;//是否一直绘制均匀网格(不管是否是对数)
std::vector<CCurveEx*>m_fillCurveVecs; //使用曲线填充时生成的闭合多边形片段集合
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 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);
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();
virtual BOOL IsGradientMidClrAuto();
void SetFillSymbol(CString name);
void ClearCurvesVec();
void ClearCurvesSelectVec();
void ClearFillCurvesVec();
virtual void afterCalculateSize();
protected:
//画曲线头
virtual void DrawTrackHead(CXyDC* pDC, CRect8 headrect);
//绘制斜井曲线充填 2015-10-9
void DrawFillCurve_Inclined(CXyDC* pDC);
//生成井曲线填充区域即斜井曲线与井壁形成的闭合区域存入多边形曲线polygon起始部分为m_curve,bLeft为true表示左闭合多边形false表示得到右闭合多边形
void GetCurveSolidRegion(CCurve& polygon, bool bLeft);
//生成阈值曲线与井壁组成的多边形,存入多边形曲线中,不成功返回falsebool 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 CreateFillCurves();
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:
// 曲线开始结束点对应的左右边界桩号 added by 2015-10-8
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);
};
#endif