#pragma once class CWellBaseObj; class AFX_EXT_CLASS CInTrackDepthSegment : public CWellBaseObj { public: CInTrackDepthSegment(); CInTrackDepthSegment(const CRect8& position); virtual ~CInTrackDepthSegment(); CLONE_WELLOBJECT(CInTrackDepthSegment) virtual void operator=(CInTrackDepthSegment& object); public: double m_fSdep; //顶深 double m_fEdep; //底深 double m_fLeftSpace; //左边空 double m_fRightSpace; //右边空 CString m_strType; //类型 WELLOBJLIST m_BendLeftList; //地层的左侧bend链表,在多井剖面模块中, CWellSection::BuildBendsRelation函数建立层与bend的联系 WELLOBJLIST m_BendRightList;//地层的右侧bend链表 public: virtual int HitTest(CPoint2D point, double dHandleSize, BOOL bSelected); virtual void MoveHandleTo(int nHandle, CPoint2D point); virtual void MoveTo(CRect8& position); virtual void Serialize(CArchive& ar, const short &ver); virtual BOOL Intersects(const CRect8& rect, double dHandleSize); //获取斜井状态下岩性符号对应的左右井边界,供TrackLithObj computedata(),BuidChildObject()调用 2015-10-19 virtual bool CalcInclinedBorder(); virtual BOOL IsTrackChildTopEnd() { return TRUE; }; //void DrawSelectRange(CXyDC *pDC); //绘制选中的区域 virtual void GetSelectRange(std::vector& PtsVec);//斜井的道内对象需要得到一个多边形的选中区域 virtual void GetRange(CRect8& range); virtual CRect8 GetRect(void); void SetTop(double dep); void SetBottom(double dep); void SetDepth(double dep); void SetRectInTrack(CRect8 TrackRect, LPVOID pWell); void SetUnViewState();//在多井段情况下,设置是否显示 virtual void SetViewState(int state); virtual CPoint2D GetHandle(int nHandle); virtual int GetHandleCount(); CCurveEx& GetLeftBorderCurve() { return m_curveLeft; }; CCurveEx& GetRightBorderCurve() { return m_curveRight; }; double GetHeight(); //获得本数据对象的高度 CPoint2D GetCenterPoint(); protected: //计算左右边界 bEqualPoints为true表示左右边界点一一对应,false则无此对应 bool CalcLeftAndRightBorders(bool bEqualPoints = false); //由左右两条线生成范围多边形 void LinkPoints(CCurve& outline); //由左右两条线生成范围多边形,最后一点不闭合 void LinkPoints(CCurve& newPoly, vector& ptsLeft, vector& ptsRight); //根据根据左右井道散点m_borderLeft,m_borderRight和左右点处的两个两个比例因子,获取闭合多边形.前提是左右边界点相同并一一对应 bool CreatePolygon(CCurve& destCurve, double ratioL, double ratioR); //根据左右井道散点m_borderLeft,m_borderRight和比例因子,获取相应比例处的曲线 bool CreatePolyline(CCurve& destCurve, double ratio); //由深度段左右散点生成原始边界线 bool CreateBorderCurve(void); void MoveShowRects(double x, double y); //当前岩性符号对应的左右井道点 vector m_borderLeft; vector m_borderRight; //原始边界 CCurveEx m_curveLeft; CCurveEx m_curveRight; ///////////////为了得到最大内部矩形/////////// //由左右两条边界线获取内部最大矩形 void GetMaxRectangle(void); //由左右两条边界线获取内部最大矩形rect,并得到该矩形的旋转角度angle,矩形中心点ptC void GetMaxRectangle(CCurve& curveLeft, CCurve& curveRight, CRect8& rect, dfPoint& ptC, double& angle); //指定中心点和宽,高,获取矩形rect void CreateRectangle(CPoint2D& ptC, double w, double h, CRect8& rect); dfPoint m_cPt; // 矩形中心点 CRect8 m_maxRect; // 最大矩形 double m_angle; // 矩形倾角 CCurveEx m_polyCurve; //在斜井状态下,本对象的范围多边形(首尾的点不重合) std::vector m_ShowRectsVec; //在直井多井段的情况下,这个结构用来保存深度段数据对象的显示矩形,因为有时有的深度段数据会被井段分为多个不同部分. void SetTopBottomDepth(CRect8 rect); BOOL GetMaxShowRect(CRect8& showrect); //对于某些分为几段显示的数据对象,挑出一个最大的现实矩形 public: virtual int ReadPCG_SelfData(CKXmlParse& xp, const short& ver , CTrackObj* pTrack) { return 0; }; virtual void WritePCG_SelfData(CFile &fw, int nBaseTabNum) {}; public: VARINTARR *m_pRowData; //该道内对象对应的数据条 int m_dataRowID; //对于二维表数据生成的道内数据对象对应的数据行ID(注意这个ID不是数据库中的数据ID,只是用来标识当前道内数据对象与井管理的数据中的对应关系) virtual void SetObjDataToRow(VARINTARR*pRow) {}; //将本对象的数据设置到对应的数据行中(主要是顶底深) virtual void RecieveTopBottomChange(CWellBaseObj* pChangeObj, double top, double bottom); virtual CString GetLayerName() { return ""; } protected: /*pMarkXy是初始符号, markRange是符号本身的范围,一般是(-0.5,0.5,0.5,-0.5) drawRect是符号在其矩形范围内应该绘制的范围比例,比如一个符号不一定占据整个符号区域,可能在其区域的中心点,尺寸小一半等等 */ void transformMarkForIncliendTrack(CXy* pMarkXy,CCurveEx& leftBorder,CCurveEx& rightBorder,CRect8 markRange,CRect8 drawRect,CXy*& pIncliendMark); CPoint2D getDepthMarkPoint(double x, double y, CRect8& markRange, double sDep, double eDep, CRect8& drawRect);/*返回的点中包含x0是点距离左道边界的比例,y0是深度,是数据转换的中间点数据*/ CPoint2D getMarkPointInTrack(CPoint2D midPoint); //使用上一个函数获得中间数据点转换为最终的井道内点 void getPtsFromMidMarkPoint(std::vector& pts,CPoint2D spt,CPoint2D ept );//获得正矩形情况下的直线变形后的点 void transformCurve(CCurveEx* pNew, CCurveEx* pOldCurve, CRect8& markRange, CRect8& drawRect, double sDep, double eDep,BOOL bMorePoint = TRUE); void transformText(CText* pNew, CText* pOldText, CRect8& markRange, CRect8& drawRect, double sDep, double eDep); CXy* m_pIncliendMark; void DrawIncliedMark(CXyDC* pDC); void DrawIncliedMark(CXyDC* pDC, CXy* pIncliendMark); };