#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 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 *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 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 >& 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 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 >& stringVector); void GetTrajectory(vector >&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 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& 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 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& 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& 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; //是否将带井斜的井柱按照垂深显示(直井柱有两种情况,一种是直接的直井,一种是斜井按照垂直深度显示,所以计算井口轨迹的数据,方法放在井柱对象中) };