#pragma once #include "WellPole.h" // 斜井柱 /* 绘制斜井柱道头时,是通过旋转DC来实现的,按照m_HeadLineAngle的角度旋转 ggff,(目前旋转的点是最左侧道的轨迹起始点) */ class AFX_EXT_CLASS ComputMiniCurvatureTrace //最小曲率法计算井轨迹 { public: ComputMiniCurvatureTrace(); virtual ~ComputMiniCurvatureTrace(); void ComputeMiniCurveture(CList &wellTraceList);//计算出结果 void GetZbOffset(CList& wellTraceList, double dep, double& x, double& y); //由深度根据井轨迹得出相应深度的坐标偏移 protected: void ComputeProjection(double k, double x3, double y3, double &x4, double &y4); //计算投影数据 }; class CInclinedTrack; class AFX_EXT_CLASS CInclinedWellPole : public CWellPole { protected: //DECLARE_SERIAL(CInclinedWellPole); public: CInclinedWellPole(); CInclinedWellPole(const CRect8& position); virtual ~CInclinedWellPole(); //克隆,虚函数 virtual void* CloneElement(void); //选择操作响应函数 virtual void MoveTo(CRect8& position); virtual void MoveHandleTo(int nHandle, CPoint2D point); virtual void MoveChildren();//移动子对象的位置 virtual BOOL Intersects(const CRect8& rect, double dHandleSize); virtual void Serialize(CArchive& ar, const short &ver); //设置水平比例 void SetLevelProportion(double p) { m_level_proportion = p; } //获得水平比例 double GetLevelProportion(void) { return m_level_proportion; } virtual void ComputeTrajectory(void); protected: public: //重写范围函数,加上底图表范围 //virtual void GetRange(CRect8& range); // 绘制井头 virtual void DrawWellHead(CXyDC* pDC); //绘制井体边框 virtual void DrawWellBodyLine(CXyDC* pDC); virtual void DrawWellBody(CXyDC* pDC); // 绘制井轨迹曲线 virtual void DrawTrajectory(CXyDC* pDC); virtual void Draw(CXyDC* pDC); //计算井对象及其包含的道对象大小 virtual void CalculateSize(CPoint2D point); // 计算某个斜深对应的轨迹(得到垂深和水平位移) void ComputeTrajectory(double dep, double &vdep, double &level); //void ComputeTraceArrange(double dep, double &vdep, double &level); //void ComputeTraceArrange(void); void ComputePolyLeftandRight(CPoint2D pt1, CPoint2D pt2, CPoint2D& leftpt, CPoint2D& rightpt, double width, double precent); //void SortTrack(CTrackObj* pTheMovingTrackObj); //void SortTrack(CArray &arrayTrackSort); //计算起始深度和结束深度对应垂深和位移,即m_topDepV, m_topLevel;,需在ComputeTrace()之后调用 2015-9-16 void ComputeTopDepAndLevel(void); //virtual BOOL RemoveSelection(); double LevelToScreenCX(double dLevel /* 水平宽度m */); double ScreenCXToLevel(double dCX); //设置投影角度,值介于0-360度 void SetProjectionAngle(double dDegree); //获取当前投影角度 double GetProjectionAngle(void) { return m_dProjectionAngle; } CCurveEx* GetTrajectoryDisplayCurve() { return &m_trajectoryCurve; } virtual void GetFrameCurve(std::vector& curvePts);//ggff virtual BOOL IsInRange(CRect8& range);//ggff virtual CPoint2D ReCalculatePoint(CPoint2D point); virtual void GetRange(CRect8& range); void GetTracksFromOtherWell(CWellPole *pWellObj); //从一口井中获得所有的道,并根据本井的轨迹重新计算道及道内数据 (注意不是复制道,是从原井直接摘走数据道) protected: //给定任意斜深,插值计算处对应的垂深和时平移,超出范围,则插值失败,返回false 2015-9-16 bool InterpolateDepVandLevel(double dep, double& depV, double& level); // 由井口深度,水平位移,显示比例等计算生成需要绘制的最终曲线 void ComputeDisplayTrajectory(); void GetInclinedWellRange(CRect8 &range, vector& trackVec); //得到斜井的范围 double m_dProjectionAngle; //投影角度,[0,360)度 CCurveEx m_trajectoryCurve; //需绘制的井轨迹曲线 public: GDFLOGPENEXT m_penTrajectory; //轨迹线笔 double m_topDepV; //井口对应的垂深 double m_topLevel; //离井口的水平位移 int m_nTraceTrackNum; //轨迹所属道号 ETrackType m_traceTrackType; //轨迹所属道类型 ETrackBorder m_traceTrackBorder; //轨迹所属道边界 };