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.

523 lines
20 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.

#pragma once
#include "WellStructDefine.h"
#include "WellClassObjGroup.h"
#include "TrackObj.h"
#include "InclinedTrack.h"
#include "TrackGroup.h"
#include "Data/DataObj_Curve.h"
#include "TreeBase.h"
/*
高峰 20250804
井道关于地层分层的道分为两类,一个是地质分层道,主要是界、系、统、组、段。 一个是井分层道,是低一级的分层级别。
两个分层级别建立了两个分层树。低级别的分层节点可以挂在地质分层树的底部节点上,这样建立两个树的关联。
*/
///井轨迹测量点
struct TrajectoryMeasurePoint
{
double fMeasureDepth; //测量点井深
double fMeasureAzimuth; //测量点方位角
double fMeasureBevel; //测量点井斜角
};
typedef CArray<TrajectoryMeasurePoint> MeasurePointArr;
class AFX_EXT_CLASS CWellPole : public CTrackGroup //CWellClassObjGroup
{
friend class CTrackObj;
public:
CWellPole();
CWellPole(const CRect8& position);
virtual ~CWellPole();
virtual void* CloneElement(void);
virtual CBaseExtend* CreateClone();
void operator=(CWellPole& wellObj);
CLONE_WELLOBJECT(CWellPole)
public:
CRect8 GetHeadRect() { return m_HeadRect; };
double GetTotalWellColumnLen();//得到井的柱子长度
EWellType m_eWellType;
void SetWellType(EWellType type) { m_eWellType = type; };
EWellType GetWellType() { return m_eWellType; }
virtual BOOL IsSectionWell() { return FALSE; };
public:
virtual int Read(CFile& fr, const short& ver);
virtual void Write(CFile& fw, const short& ver);
//设置深度比例
void SetDepthProportion(double p) { m_fProportion = p; }
//获取深度比例
double GetDepthProportion(void) { return m_fProportion; }
struct well_interval
{
double top;
double bottom;
double Spacedis;//距离上个井段的间距 ,是逻辑长度,不是深度长度
well_interval() { Spacedis = 100; }
};
std::vector<well_interval> *GetIntervalVec() { return &m_WellIntervalVec; }
void AddWellInterval(double top, double bottom, double Spacedis = 100);//距离上个井段的间距 ,是逻辑长度,不是深度长度
int GetIntervalID(double depth); //由深度得到深度段ID
double GetIntervalLength(int interId);//
double GetIntervalBottom(int interId);
double GetIntervalTop(int interId);
double GetIntervalSpaceDis(int interId); //某个井段的空白间距
void SetIntervalTop(int interId, double top);
void SetIntervalBottom(int interId, double bottom);
void SetIntervalSpaceDis(int interId, double spaceDis);
double GetTotalWellLength();//得到井的总长度单位是米(垂深时是垂直深度的总长度)
double GetTotalSpacedis();
int GetDepthInWell(double posY, double & retdepth); //由位置反算其在某个井段的深度。 返回这个位置所在的井段id号。如果-1则不在井段内
int GetPosIntervalID(double posY, int &preId);////由位置反算其在某个井段内,如果返回制返回值是-1,不在有效井段内;preId是指前一个井段ID,如果返回值是-1,preID>-1表示本次深度是在井断preID和preID+1之间
// 井基类Flags
enum WellFlags
{
WellFlagTitle = 0x0001, // 显示井标题
WellFlagHeadBounds = 0x0002, // 显示井头外框
WellFlagBodyBounds = 0x0004, // 显示井身外框
WellFlagTrace = 0x0008, // 显示井轨迹
WellFlagLeftView = 0x0010, // 左视
WellFlagTrackCorra = 0x0020, // 井斜校正
WellFlagShowDepth = 0x0040, // 显示深度
WellFlagShow = 0x0080 // 显示井本身
};
protected:
std::vector<well_interval> m_WellIntervalVec;
protected:
void Init();
protected:
DWORD m_nWellFlags; // 井开关状态
CString m_strWellName;
CString m_strSymbolProvider;
public:
GDFLOGPENEXT m_penTrack; // 道框笔
GDFLOGPENEXT m_penGridMajor; // 主刻格线笔
GDFLOGPENEXT m_penGridMinor; // 次刻格线笔
GDFLOGFONTEXT m_fontTrack; // 道头字体
//LOGFONT m_lfontTrack;
GDFLOGFONTEXT m_fontHeadMark; // 道头刻度字体
// LOGFONT m_lfontHeadMark;
GDFLOGFONTEXT m_fontGridMark; // 深度刻度字体
// LOGFONT m_lfontGridMark;
double m_fMajorSpace; // 主深度标注间隔
double m_fMinorSpace; // 副深度标注间隔
double m_fProportion; // 深度比例
double m_fLevel; // 补心海拔
double m_fMarginLR; // 左右空白范围 (以毫米计算)
double m_fMarginTB; // 上下空白范围
double m_dSdep;
double m_dEdep;
double m_dDepthRatio;
double m_dHeightWellHead; // 井头高度
double m_dHeightTrackHead; // 道头高度
double fHighTableHead; // 头表格高度
double fHighTableFoot; // 尾表格高度(图例)
CPoint2D m_TraceStartPt; // 轨迹起始点对应的逻辑坐标点
double m_HeadLineAngle; // 井头旋转角度,逆时针
double m_level_proportion; //水平比例 (涉及dml,pcg文件的读取问题,当读取文件时无法分清楚是否是直井或斜井,所以放在这儿)
//如果是斜井,这些用来存储偏转后的井头四个点的坐标及中心点,四个点依次对应矩形的左上,右上,右下,左下(每次井size时计算)
//CCurveEx m_HeadCurve;
INCLINEDWELLSTRUCTLIST m_InclinedWellList;
int m_nXjDataType; //斜井数据类型
BOOL m_bResForm;
CString m_CopyrightName;
protected:
TRACKLIST TrackObjListTmp; // 道临时链表
DWORD nFlagsActionTmp; // 操作类的临时开关(写模板、备份等使用)
public:
double GetTrackHeadHigh();
void SetWellName(CString strName) {m_strWellName = strName;};
CString GetWellName() { return m_strWellName; }
CCurve& GetWellHeadCurve() { return m_HeadCurve; };
//重写范围函数,加上底图表范围
virtual void GetRange(CRect8& range);
virtual CRect8 GetRect(void);
//计算井对象及其包含的道对象大小
virtual void CalculateSize(CPoint2D point);
//将对象添加到子对象链表
//virtual void Add(CObjectBase* pObj);
//添加标题对象
virtual void AddObjTitle();
//重新计算井内非道子对象和道内子对象的位置
virtual void ResetAllObjectsPosition(double offset, CRect8 orig_position);
virtual void AddTrack(CTrackObj* pTrackObj);
//virtual void SetParentObj(CObjectBase * pobjParent);
//井全局参数设置
virtual void SetPenWell(GDFLOGPENEXT& pen);
virtual void SetFontWell(GDFLOGFONTEXT& font);
virtual void SetPenTrack(GDFLOGPENEXT& pen);
virtual void SetPenGrid(GDFLOGPENEXT& penmajor, GDFLOGPENEXT& penminor);
virtual void SetFontTrack(GDFLOGFONTEXT& font, BOOL bReplaceClr = TRUE);
virtual void SetFontHeadMark(GDFLOGFONTEXT& font, BOOL bReplaceClr = TRUE);
virtual void SetFontGridMark(GDFLOGFONTEXT& font);
virtual void SetSpace(double major, double minor);
virtual void SetTitle(CString text, BOOL bShow = TRUE);
//开关变量值
virtual void SetWellFlags(DWORD flags);
virtual void SetShowTitle(BOOL bFlag);
virtual void SetShowHeadBounds(BOOL bFlag);
virtual void SetShowBodyBounds(BOOL bFlag);
virtual void SetShowTrace(BOOL bFlag);
virtual void SetLeftView(BOOL bFlag);
virtual void SetTrackCorra(BOOL bFlag);
virtual void SetShowDepth(BOOL bFlag);
virtual void SetShow(BOOL bFlag);
virtual DWORD GetWellFlags();
virtual BOOL IsShowTitle();
virtual BOOL IsShowHeadBounds();
virtual BOOL IsShowBodyBounds();
virtual BOOL IsShowTrajectory();
virtual BOOL IsLeftView();
virtual BOOL IsTrackCorra();
virtual BOOL IsShowDepth();
virtual BOOL IsShow();
//重设井参数
virtual void ReSetWellTitle();
//当井的宽度,或者道的数量发生变化,就调整交会图交互对象
virtual void ReSetCurveCrossPos();
//井深度发生变化,就调整相应的交会图交互对象
virtual void ResetCurveCrossWelldepth();
//清除所有井内方波曲线
virtual void ClearAllCurveBlock();
//根据名称获取曲线对象
CTrackCurve *GetObjCurveFromName(CString curveName);
//查找道移动到的新位置(返回值0纵向1横向
int FindTrackPosition(CTrackObj* pMovingTrackObj, CPoint2D& ptBegin, CPoint2D& ptEnd);
CTrackObj* FindDataRefTrackPcg(LPCTSTR lpszDataRef, BOOL bAdd);
////绘制井操作
virtual void DrawTrackHead(CXyDC*pDC);
//绘制井头,示例线,文字
virtual void DrawWellHead(CXyDC* pDC);
//绘制井体,曲线,背景网格
virtual void DrawWellBody(CXyDC* pDC);
//绘制井头边线
virtual void DrawWellHeadLine(CXyDC* pDC);
//绘制井体边线
virtual void DrawWellBodyLine(CXyDC* pDC);
//绘制井外框
virtual void DrawWellFrameLine(CXyDC* pDC);
////绘制井头外框
virtual void DrawWellHeadFrameLine(CXyDC* pDC);
virtual void DrawWellBodyFrameLine(CXyDC* pDC);
virtual void Draw(CXyDC* pDC);
///判断道是否是组合道中的道
// virtual BOOL IsInTrackGroup(CTrackGroup* pTrackGroup, CTrackObj* pTrack);
//绘制头尾表格
//virtual void DrawTableHead(CXyDC* pDC);
//virtual void DrawTableTail(CXyDC* pDC);
//重写交互操作
virtual int HitTest(CPoint2D point, double dHandleSize, BOOL bSelected);
virtual int GetHandleCount();
virtual CPoint2D GetHandle(int nHandle);
virtual void MoveChildren();//移动子对象的位置
virtual void MoveTo(CRect8& position);
virtual void MoveHandleTo(int nHandle, CPoint2D point);
virtual CWellBaseObj* ObjectAt(const CRect8& rect, double dHandleSize, BOOL bNesting = FALSE);
virtual void Serialize(CArchive& ar, const short &ver);
/* 实际坐标与屏幕坐标(是绘图的逻辑坐标,不是屏幕坐标像素)转换 */
double DepthToScreenY(double dDepth /* 实际深度m */); //深度米转为按井的位置计算的逻辑位置。
double ScreenYToDepth(double dY); //逻辑位置转为按井的位置计算的深度。
double HeightToScreenCY(double dHeight /* 高度m */); // 长度m转为井逻辑长度
double ScreenCYToHeight(double dCY); //逻辑长度转井的纵向长度mi
////根据井内道的宽度计算井的宽度
virtual double ComputeWellWidth();
//读完道内容后调用
virtual void ComputeReadTrackEnd();
//重设道头高度
virtual void ReSetTrackHead();
//重设井头高度
virtual void ReSetWellHead();
//应用模板
TRACKLIST& GetTemplateList();
virtual void ApplingTemplate(BOOL bFlag = FALSE, double dOldTrackHead = 0.0, double dOldWellHead = 0.0);
void ApplingTemplate(PCG_WELLCOLARRAY & wellColArr);
void ApplingTemplate(PCG_WELLTEMPCOL* pWellColParent, CTrackGroup* pParentGroup);
double GetHeadLineAngle() { return m_HeadLineAngle; }
CPoint2D& GetTraceStartPt();
void SetRotateHeadAngleDC(CXyDC *pDC);
void RecoverRotateHeadAngleDC(CXyDC *pDC);
void SetWellColumnAvgWidth(double dw); //将井柱按照设置的宽度均匀分配给井内各道
CPoint2D GetAnchorPoint() { return m_HeadRect.TopLeft(); }; //得到井计算位置的锚点
////从string vector中读取数据 转换后存入m_InclinedWellVec
//void LoadFromStringVec(vector<vector<CString> >& stringVector);
//// 计算、填充斜井数据
void ComputeTrajectory(double azimuth, double bevel,
double dep, double &depV,
double xo, double yo, double &x, double &y);
//计算投影数据
void ComputeProjection(double k,
double x3, double y3,
double &x4, double &y4);
//从测量深度获得垂深
double GetVDepth(double depth);
//从垂深获得测量深度
double GetMeasuredDepth(double vdepth);
void SetWellDepth(double sdep, double edep);//对于默认是一个井段的情况,用这个功能设置井初始值
BOOL IsInWellTrackHead(CRect8& range); //在井头部及道头部区域
//数据转移
virtual void TransferData(CWellBaseObj* pObj);
//void GetAllTrack(TRACKLIST* trackList);
CTrackGroup& GetTrackGroup() { return *(CTrackGroup*)this; }
virtual void SerializeHead(CArchive& ar, const short& ver);
CWellPole* CreateWellObj(DWORD type);
BOOL FindWellColumn(PCG_WELLCOLARRAY & wellColArr, CString strColRef);
double m_k; //投影面方程斜率(定为投影面过原点)
CString m_strTrajectoryTrackName;// 井身轨迹名称
int m_nMeasureCount; // 测量点总数
MeasurePointArr m_MeasurePointsArr; // 测量点数据
void CloneOtherParameter(const CWellPole & wellObj);
std::vector<CWellDataObj_Curve*> m_CurveDataVecs; //保存一些道中不显示的曲线,用来备用
virtual void Transform(CXyDC* pDC, float* matrix, BOOL bUndo);
//virtual void Transform(float* matrix, BOOL bUndo);
void SetScale(double xScale, double yScale);
void SetTrajectory(vector<vector<CString> >& stringVector);
void GetTrajectory(vector<vector<CString> >&datas);
double ComputeProjectAngle();
public:
virtual BOOL IsWellStyleSimple();
virtual BOOL IsWellStyleComplete();
protected:
//CTrackGroup m_TrackObjGroup;
public:
//PCG读写
virtual int ReadPCG(CFile &fr, const short &ver);
virtual void WritePCG(CFile &fw, const short& ver, int nBaseTabNum);
virtual void ReadPCGEnd();
//pcg读取
virtual int ReadPCG_Head(CXmlParse &xp, const short& ver);
virtual int ReadPCG_Styles(CFile &fr, CXmlParse &xp, const short& ver, BOOL bDml = FALSE);
virtual int ReadPCG_WellTemplate(CFile &fr, const short& ver, PCG_WELLCOLARRAY & wellColArr);
virtual int ReadPCG_WellColumn(CXmlParse &xp, CFile &fr, const short& ver, PCG_WELLTEMPCOL* pWellColParent, int& totalCount);
virtual int ReadPCG_Traces(CFile &fr, const short& ver, PCG_WELLCOLARRAY & wellColArr);
virtual int ReadPCG_Datas(CFile &fr, const short &ver);
//virtual int ReadPCG_Exts(CFile &fr, const short &ver);
virtual int ReadPCG_CallOuts(CFile &fr, const short &ver);
virtual int ReadPCG_Trajectory(CFile &fr, CXmlParse &xp, const short &ver);
//pcg写入
virtual void WritePCG_Head(CFile &fw, int nBaseTabNum); //pcg文件中 头部分
virtual void WritePCG_Tail(CFile &fw, int nBaseTabNum); //pcg文件中 尾部分
virtual void WritePCG_PrintTemplate(CFile &fw, int nBaseTabNum); //pcg文件中 打印模板
virtual void WritePCG_Symbols(CFile &fw, const short& ver, int nBaseTabNum); //pcg文件中 符号部分
virtual void WritePCG_Styles(CFile &fw, int nBaseTabNum, BOOL bDml = FALSE); //pcg文件中 样式部分
virtual void WritePCG_WellTemplate(CFile &fw, int nBaseTabNum); //pcg文件中 井模板
virtual void WritePCG_WellColumn(CFile &fw, int nBaseTabNum, CTrackGroup* pTrackGroupParent); //pcg文件中写组合道模板
virtual void WritePCG_Traces(CFile &fw, int nBaseTabNum); //pcg文件中 道部分
virtual void WritePCG_Trajectory(CFile &fw, int nBaseTabNum); //pcg文件中 井轨迹
virtual void WritePCG_Datas(CFile &fw, int nBaseTabNum); //pcg文件中 道数据
//virtual void WritePCG_Exts(CFile &fw,int nBaseTabNum); //pcg文件中 自定义扩展
virtual void WritePCG_CallOuts(CFile &fw, const short& ver, int nBaseTabNum);
virtual void WritePCG_WellIntervals(CFile &fw, int nBaseTabNum);
protected:
int ReadPCG_Styles_Title(CFile &fr, CXmlParse &xp, const short& ver);
int ReadPCG_Styles_Grid(CFile &fr, CXmlParse &xp, const short& ver);
int ReadPCG_Styles_Border(CFile &fr, CXmlParse &xp, const short& ver);
int ReadPCG_Styles_Splitline(CFile &fr, CXmlParse &xp, const short& ver);
int ReadPCG_Styles_Track(CFile &fr, CXmlParse &xp, const short& ver);
void WritePCG_Styles_Title(CFile &fw, int nBaseTabNum);
void WritePCG_Styles_Grid(CFile &fw, int nBaseTabNum);
void WritePCG_Styles_Border(CFile &fw, int nBaseTabNum);
void WritePCG_Styles_Splitline(CFile &fw, int nBaseTabNum);
void WritePCG_Styles_Track(CFile &fw, int nBaseTabNum);
int ReadPCG_WellIntervals(CFile &fr, CXmlParse &xp, const short& ver); //读取井段数据
/////////////////////////////////////////////////////////
public:
typedef struct _WellHeadLockInfo
{
BOOL bLock; //是否锁住了井头
double dShowStartDep;//锁住井头后可以显示的井段起始深度
double dShowEndDep; ///锁住井头后可以显示的井段结束深度
std::vector<well_interval> m_BakWellIntervalVec; //用来备份原有的显示井段
}WELLHEADLOCKINFO;
WELLHEADLOCKINFO m_LockHeadInfo;
void SetHeadLockState(BOOL block = FALSE, double sdep = 0, double edep = 0);
void SetHeadLockStateDepth(double sdep, double edep); //在井头锁定情况下, 井柱体移动时设置显示的井段。
double GetHeadLockStartDepth();
double GetHeadLockEndDepth();
double GetDepthLength() { return (m_dEdep - m_dSdep); };
double GetTrackStartTop() { return m_position.top - m_dHeightTrackHead - m_dHeightWellHead; }
/////////////////////////////////////////////////////////////////////////////////////////////////////////
virtual int ReadPCG(CKXmlParse& xp, const short &ver);
virtual int ReadPCG_Head(CKXmlParse &xp, const short& ver);
virtual int ReadPCG_Styles(CKXmlParse &xp, const short& ver, BOOL bDml = FALSE);
virtual int ReadPCG_WellTemplate(CKXmlParse &xp, const short& ver, PCG_WELLCOLARRAY & wellColArr);
virtual int ReadPCG_WellColumn(CKXmlParse &xp, const short& ver, PCG_WELLTEMPCOL* pWellColParent, int& totalCount);
virtual int ReadPCG_Traces(CKXmlParse& xp, const short& ver, PCG_WELLCOLARRAY & wellColArr);
virtual int ReadPCG_Datas(CKXmlParse& xp, const short &ver);
virtual int ReadPCG_CallOuts(CKXmlParse& xp, const short &ver);
virtual int ReadPCG_Trajectory(CKXmlParse& xp, const short &ver);
int ReadPCG_Traces_GetTraceProps(CKXmlParse& xp, PCG_TRACECOL& traceCol);
virtual int ReadPCG_TableDatas(CKXmlParse& xp, const short &ver);
protected:
int ReadPCG_Styles_Title(CKXmlParse &xp, const short& ver);
int ReadPCG_Styles_Grid(CKXmlParse &xp, const short& ver);
int ReadPCG_Styles_Border(CKXmlParse &xp, const short& ver);
int ReadPCG_Styles_Splitline(CKXmlParse &xp, const short& ver);
int ReadPCG_Styles_Track(CKXmlParse &xp, const short& ver);
int ReadPCG_WellIntervals(CKXmlParse &xp, const short& ver); //读取井段数据
int ReadPCG_Stratification(CKXmlParse &xp, const short& ver); //读取地层分层级别数据
void WritePCG_Stratification(CFile &fw, int nBaseTabNum); //写地层分层级别数据
void SetOneTrajectory(Struct_InclinedWell& destWell, vector<CString>& srcVec);
void InTrackObjBindDataRow(BOOL bSerialize);
void InitWellDataTables();
void ReadPCG_StratumDivision(CKXmlParse &xp, const short& ver);
void ReadPCG_WellLayerDivision(CKXmlParse &xp, const short& ver);
public:
virtual void GetTrajectoryDatasJson(CString& jsonStr);
virtual BOOL SetTrajectoryDatasJson(CString& jsonStr);
virtual BOOL SetWellStratification(CString& jsonStr);
virtual BOOL SetStratumDivision(CString& jsonStr);
virtual BOOL SetWellSandSets(CString& jsonStr, BOOL bRefreshTracks = FALSE);
void GetWellSandSets(CString& jsonStr);
virtual BOOL SetWellReservesLayers(CString& jsonStr, BOOL bRefreshTracks = FALSE);
void GetWellReservesLayers(CString& jsonStr);
virtual BOOL SetFaultPoints(CString& jsonStr, BOOL bRefreshTracks = FALSE);
virtual void GetFaultPoints(CString& jsonStr);
CWellDataObj* GetWellDataTable(CString strTableId);
virtual void WritePCG_TableDatas(CFile &fw, int nBaseTabNum);
void SetTableRowIDToTreeNode(int colNodeId,CWellDataObj* pWellData);
public:
int GetTableDataRowID(CString tableID, VARINTARR*pRow);
void NotifyTableDataChange(CWellBaseObj* pInTrackObj);
void RefreshTableDataInAllTrack(CString tableID);
void DeleteTableDataRow(CString tableID, CString ChangColId, CWellBaseObj* pDelObj, VARINTARR*pRow);
void UpdateRowData(CString tableID, CWellBaseObj* pBaseObj);
void AddRowData(CString tableID, CWellBaseObj* pBaseObj);
void GetDatasTopBottomDepth(double& top, double &bottom); // 获取井柱中不是曲线道的内部对象的顶底深。
public:
void ClearData();
std::vector<CWellDataObj*> m_TableDatas;
CTreeBase m_WellStratiTree; //井分层树
CString m_WellStratificationJson;
CTreeBase m_StratumDivisionTree; //地质分层树
CString m_strStratumDivisionJson;
BOOL m_bReadFile; //表示处于读取文件的状态
void ClearTrackLayersBendList();
CRect8 m_tOldPos; //临时变量
public:
void CopyWellData(CWellPole& Object);
//InclinedWell
public:
//设置水平比例
void SetLevelProportion(double p) { m_level_proportion = p; }
//获得水平比例
double GetLevelProportion(void) { return m_level_proportion; }
//给定任意斜深,插值计算处对应的垂深和时平移,超出范围则插值失败返回false
bool InterpolateDepVandLevel(double dep, double& depV, double& level);
// 由井口深度,水平位移,显示比例等计算生成需要绘制的最终曲线
void ComputeDisplayTrajectory();
void GetInclinedWellRange(CRect8& range, vector<CInclinedTrack*>& trackVec); //得到斜井的范围
double LevelToScreenCX(double dLevel /* 水平宽度m */);
double ScreenCXToLevel(double dCX);
void SetProjectionAngle(double dDegree);
//获取当前投影角度
double GetProjectionAngle(void) { return m_dProjectionAngle; }
CCurveEx* GetTrajectoryDisplayCurve() { return &m_trajectoryCurve; }
virtual void ComputeTrajectory(void);
void ComputeTopDepAndLevel(void);
virtual void GetFrameCurve(std::vector<CPoint2D>& curvePts);//ggff
virtual BOOL IsInRange(CRect8& range);//ggff
virtual CPoint2D ReCalculatePoint(CPoint2D point);// 斜井状况下,需要计算一些井头区域的点在直井情况下的位置
// 计算某个斜深对应的轨迹(得到垂深和水平位移)
void ComputeTrajectory(double dep, double& vdep, double& level);
void ComputePolyLeftandRight(CPoint2D pt1, CPoint2D pt2, CPoint2D& leftpt, CPoint2D& rightpt, double width, double precent);
virtual void DrawTrajectory(CXyDC* pDC);
virtual BOOL Intersects(const CRect8& rect, double dHandleSize);
GDFLOGPENEXT m_penTrajectory; //轨迹线笔
double m_topDepV; //井口对应的垂深
double m_topLevel; //离井口的水平位移
int m_nTraceTrackNum; //轨迹所属道号
ETrackType m_traceTrackType; //轨迹所属道类型
ETrackBorder m_traceTrackBorder; //轨迹所属道边界
BOOL IsVerticalPole();
void SetVerticalPole(BOOL b);
protected:
double m_dProjectionAngle; //投影角度,[0,360)度
CCurveEx m_trajectoryCurve; //需绘制的井轨迹曲线
void CaculateInclineWellSize();
void MoveToInclineWell(CRect8& position);
void MoveHandleToInclineWell(int nHandle, CPoint2D point);
CPoint2D CaculateTraceStartPt(); // 从轨迹线所在的道得出轨迹线的起始点。
BOOL m_bVWell; //是否将带井斜的井柱按照垂深显示(直井柱有两种情况,一种是直接的直井,一种是斜井按照垂直深度显示,所以计算井口轨迹的数据,方法放在井柱对象中)
};