/************************************************************************************** 文 件 名:CItemWcsSingleWell.h 主要功能: 剖面图单井操作各类元素或完成一定的功能 主要函数列表: 1 virtual BOOL InitPropertyGrid(CXTPPropertyGrid& grid); 初始化属性窗口 2 virtual void OnLButtonDown(UINT nFlags, CPoint point); 鼠标操作 3 virtual void OnLButtonUp(UINT nFlags, CPoint point); 4 virtual void OnMouseMove(UINT nFlags, CPoint point); 5 virtual void OnDraw(CXyDC* pXyDC); 绘制辅助手柄 6 virtual BOOL OnGridItemChangeValue(CXTPPropertyGridItem* pItem); 响应属性框改变消息的函数 7 void TrackLeftGroup(); 道的左组合 8 void TrackRightGroup(); 右组合 **************************************************************************************/ #pragma once #include "../ItemWellBase.h" //typedef TObjectList CDataObjList; class CTrackGroup; namespace NItem { class CItemWcsSingleWell : public CItemWellBase { public: CItemWcsSingleWell(CSigmaDoc* pDoc); ~CItemWcsSingleWell(void); virtual void OnLButtonDblClk(UINT nFlags, CPoint point) override; virtual void OnLButtonDown(CDC *pDC, UINT nFlags, CPoint point, int vk) override; virtual void OnLButtonUp(CDC *pDC, UINT nFlags, CPoint point, int vk = 0) override; virtual int OnMouseMove(CDC *pDC, UINT nFlags, CPoint point) override; virtual void OnRButtonDown(UINT nFlags, CPoint point) override; virtual int GetSubMenu(); virtual BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); virtual BOOL OnSetCursor(CPoint pt, int& handle); /** @brief 绘制辅助手柄 */ virtual void OnDraw(CXyDC* pXyDC); virtual void OnDraw(CXyDC* pXyDC, CDC* pDC); //根据图元创建操作Item virtual CItemWellBase* CreateItem(CWellBaseObj* pObj); virtual void DeleteItem(); virtual CWellPole *GetWellObject(); virtual void SetDrawObj(CWellBaseObj* pObj); virtual CWellBaseObj* GetDrawObj(); void EnableEditTrackInData(BOOL b) { m_bEditTrackInData = b; } BOOL IsEditTrackInData() { return m_bEditTrackInData; } CTrackObj* GetSelectedTrack(); //添加道 virtual bool AddTrack(); BOOL AddTrack(CTrackObj* pSelectTrack, int trackType[], int trackNum, TRACKLIST& newTracks); //在选中的道后添加道 virtual bool AddTrackAfterSelected(); //道的左组合 void TrackLeftGroup(); //右组合 void TrackRightGroup(); //设置鼠标左键状态 void SetLDown(BOOL bL) { m_bLDown = bL; } //清空选择对象 virtual void Clear(); virtual int DeleteSelection(void); ////应用井模板 virtual BOOL ApplingWellTemplate(CString filePath); virtual void ApplingWellDbTemplate(); //添加道内数据对象 void AddTrackInObjData(); //构建道内对象 void BuildTrackInObj(CTrackObj* pTrackObj, vector &fields, StringVectorSet &datas, vector &fields2,StringVectorSet &vecdatas2); //构建道内对象 void BuildTrackInObj(CTrackObj* pTrackObj, double *pDepth,double *pData,int datanum); //类型获取道内对象数据表、字段 void GetTrackTable(CTrackObj* pTrackObj, CString &strTrackType, CString& table, CString& curve); ////整体导入库数据 void ImportDataAll(CWellPole* pWell, BOOL bReplace=TRUE); //void ImportDataFromLM(CTrackGroup* pGroup,CWellPole* pWell,CLMInterface* pLM); //void ImportDataFromDB(CTrackGroup* pGroup,CWellObj* pWell,Db::CSqlStatementManager *pSqlManager, BOOL bReplace=TRUE); //void ImportTrackDataFromDB(CTrackObj* pTrack,CWellObj* pWell,Db::CSqlStatementManager *pSqlManager, BOOL bReplace=TRUE); /////曲线道从库导入数据时,从工区获取所有版本号和施工序号 void GetOperationAndVersion(const CString strWellName, const CString strCurveName, vector &OperatVec, vector &VersionVec); /// 把选择道的数据导入到数据库中 void ExportDataAll(CWellPole* pWell); void ExportDataToDB(CTrackObj* pTrackObj); /// 判断鼠标dowm时是否选中边框线; void BeSelectBorderLine(CTrackGroup* pGroup,CPoint2D pt,double dHandleSize ,CDC *pDC); ///鼠标移动时不同位置的光标 BOOL SetMoveCursor(CTrackGroup* pGroup, CPoint2D pt, double dHandleSize, CWellPole* pWell); BOOL SetMoveCursor(CTrackGroup* pGroup, CPoint2D pt, double dHandleSize, CWellPole* pWell, int& handle); /// 拖动井时道重新排序 ,SortTrackWhenMoving本函数会递归调用因此记录一下层次 BOOL SortTrackWhenMoving(CTrackGroup* pGroup,CTrackObj* pTrackMoving, int& ideep); ///////////////岩芯归位相关函数 ///岩芯归为时处理散点道选中的深度段数据 //void MoveDiscreteSegement(CObjectBase* pObj,const double fdistance); //////HFX 岩芯归位后选中深度段内的散点数据,以及整个过程中深度的起始下表和结束下表 //void GetDepthAndValueDiscreteSegement(CObjectBase* pObj,CArray &ArrDepth,CArray &ArrValue,const double dTop, const double dBot,int &nStratIndex,int &nEndIndex); ////////岩芯归位深度段内的散点数据重新排序 //void SortDiscreteSegment(CArray &ArrDepth,CArray &ArrValue); ///////排好顺序的散点数据放回离散道的数据中 //void SetDiscreteSegment(CObjectBase* pObj,CArray &ArrDepth,CArray &ArrValue,const int nStartIndex,const int nEndIndex); ////////////////////////////////////////////////// void DrawWellHandle();///< 画井选中状态 /// 连接工区情况下获得工区中当前交互井的所有曲线或者散点名字 void GetAllCurveNameInDb(CStringArray &strNameArr,const CString strTableName,CString nameField); //void GetWavetraceDataNameFromDb(CStringArray &strNameArr); ////////////////////////////////////////////////////////////////////////// /////生成图例时从井中获取可用于生成图例的对象 //virtual void GetLegendObject(const CStringArray &StyleList,CRect8 rt); ///////生成图例时过滤掉重复的内容 //virtual BOOL IsRepeat(CObjectBaseList &Objectlist,const CString strName); ///////创建图例对象并添加到CXy //virtual void CreatLegendObject(CObjectBaseList &Objectlist,CRect8 rt,CXy* pXy); //virtual void GetSymbolObj(CObjectBaseList &Objectlist,const CStringArray &StyleList, CWellPole* pWell); ////////////////////////////////////////////////////////////////////////// //测井分析 virtual BOOL AnalysisPor(); virtual BOOL AnalysisSand(); virtual BOOL CalculatePor(); virtual BOOL CalculateSH(); void CurveDataStatistic(); void DrawSelectPolyRange(CXyDC* pXyDC,std::vector& PtsVec); /*使用SetReUnDoAction时,会使用存档井柱对象进行替换操作,所以此句代码前获得的井柱指针都重新获取一次*/ virtual void SetReUnDoAction(BOOL bNoSaveData = TRUE, UINT actionType = IDS_STRING_ACTION_MOVE, int actionItemType = 1, CWellBaseObj* pWellBase = NULL); void SetWellFrame(BOOL b) { m_bWellFrame = b; } protected: CInsertDraw *GetLegendInsertDraw(CString strMark); //从名称得到一个可以插入图例的符号 double GetWellProjecttionAngle(CWellPole *pWellObj); //得到一口井的最好的投影角度 void SetScrollBarRange(); void CreateDragImage(); CBitmap* GetBitmap(CDC* pdc,CRect wellHRect,CRect ilnWellHRect,BOOL bTrack = FALSE,CPoint *plgPts = NULL); virtual void DrawHandle(CXyDC *pDC);///< 画当前图元选中状态 ggff virtual void DrawHandle(CXyDC *pDC, const CPoint2D &point); //ggff virtual void DrawSelected(CXyDC *pXyDC,CWnd *pWnd); void DrawMoveSelected(CXyDC *pXyDC,CWnd *pWnd); BOOL ApplingTemplate(CKXmlParse& xp); void ApplingFileTemplate(CFile &fr); ////获得组合道中最右边的道 CTrackObj* GetLastTrackFromTrackGroup(CTrackGroup* trackGroupObj); ////Por分析时生成新图道 //void CreatePorTrack(CWellObj* pWell,CDataObjList& CurveList,BOOL bAddResult,double PorTemp,double SwWaterTemp,double SwOilTemp,double AnalysisHd); ////Sand分析时生成新图道 //void CreateSandTrack(CWellObj* pWell,CDataObjList& CurveLista,BOOL bAddResult,double PorTemp,double SwWaterTemp,double SwOilTemp,double AnalysisHd); ////生成新的曲线道 CTrackCurve* CreateNewCurveTrack(CWellPole* pWell,CString strTrackName,CString strUnit,double TrackWidth,double LeftValue,double RightValue,BOOL bLog,COLORREF clr); //添加道 void AddTrack(CTrackObj* pTrackSelected, TRACKLIST& trackAddList, BOOL bTrackGroup=FALSE); void DestroyVHCursor(); //CreateAngleCursor(HCURSOR cursor= 原始光标,CBitmap *pCursorBmp =新光标的位图,CBitmap *pCursorMaskBmp=新光标的掩码为图,double angle=旋转角度) HCURSOR CreateAngleCursor(HCURSOR cursor,CBitmap* pCursorBmp ,CBitmap* pCursorMaskBmp,double angle);//ggff void CreateVHCursor(); //void AddWellIntervals(CXTPPropertyGridItem* pParentItem);//初始化井段数据信息 protected: CWellPole* m_pWell; ///< 当前交互的井 CSigmaDoc* m_pWndOld; CImageList* m_pDragImage; ///< 拖拽位图 CRect m_rectImage; ///< 对象被选中范围 BOOL m_bEditTrackInData; ///< 选中道内空白处编辑数据 BOOL m_bDragImage; BOOL m_bWellFrame; int m_nTrackPos; ///< 道位置类型0纵向,1横向 CPoint2D m_ptBegin; ///< 插入道位置的起始点 CPoint2D m_ptEnd; ///< 插入道位置的结束点 int m_PointNum; CPoint *m_pPointBuf; HCURSOR m_VCursor,m_HCursor; //斜井情况下的垂直于井头的光标,水平于井头的光标 ggff CBitmap *m_pVCursorBmp,*m_pVCursorMaskBmp,*m_pHCursorBmp,*m_pHCursorMaskBmp; std::vector m_DcVec; //当与多个窗体相关时,放置多个窗体的DC std::vector m_WndVec; LOGFONT m_logFont; public: void DrawMovedTrackPicture(CDC* pDC); CTrackObj* GetMoveInTrack(CTrackGroup* pGroup, CTrackObj* pTrackMoving); //移动道的过程中获得其移动的位置 }; };