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.

228 lines
9.3 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.

/**************************************************************************************
文 件 名ItemSingleWell.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<CWellDataObj> CDataObjList;
class CTrackGroup;
namespace NItem
{
//struct DiscretreDataStuct
//{
// float depth;
// float value;
//};
class CItemSingleWell : public CItemWellBase
{
public:
CItemSingleWell(CSigmaDoc* pDoc);
~CItemSingleWell(void);
virtual void CancelSelection(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) override;
/** @brief 初始化属性窗口 */
//virtual BOOL InitPropertyGrid(CXTPPropertyGrid& grid);
///** @brief 响应属性框改变消息的函数 */
//virtual BOOL OnGridItemChangeValue(CXTPPropertyGridItem* pItem);
/** 响应属性框内按钮弹出新的对话框*/
//virtual void OnInplaceButtonDown(CXTPPropertyGridItem* pItem);
//根据图元创建操作Item
virtual CItemWellBase* CreateItem(CWellBaseObj* pObj);
virtual void DeleteItem();
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();
virtual bool AddTrackDlg(CWellPole* pWellObj,CTrackObj* pSelectTrack);
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 void ApplingWellTemplate();
virtual void ApplingWellDbTemplate();
//添加道内数据对象
void AddTrackInObjData();
//构建道内对象
void BuildTrackInObj(CTrackObj* pTrackObj, vector<CString> &fields, StringVectorSet &datas, vector<CString> &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<CString> &OperatVec, vector<CString> &VersionVec);
/// 把选择道的数据导入到数据库中
void ExportDataAll(CWellPole* pWell);
void ExportDataToDB(CTrackObj* pTrackObj);
/// 判断鼠标dowm时是否选中边框线
void BeSelectBorderLine(CTrackGroup* pGroup,CPoint2D pt,double dHandleSize);
///鼠标移动时不同位置的光标
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);
CTrackObj* GetMoveInTrack(CTrackGroup* pGroup, CTrackObj* pTrackMoving); //移动道的过程中获得其移动的位置
///////////////岩芯归位相关函数
///岩芯归为时处理散点道选中的深度段数据
//void MoveDiscreteSegement(CObjectBase* pObj,const double fdistance);
//////HFX 岩芯归位后选中深度段内的散点数据,以及整个过程中深度的起始下表和结束下表
//void GetDepthAndValueDiscreteSegement(CObjectBase* pObj,CArray<double> &ArrDepth,CArray<double> &ArrValue,const double dTop, const double dBot,int &nStratIndex,int &nEndIndex);
////////岩芯归位深度段内的散点数据重新排序
//void SortDiscreteSegment(CArray<double> &ArrDepth,CArray<double> &ArrValue);
///////排好顺序的散点数据放回离散道的数据中
//void SetDiscreteSegment(CObjectBase* pObj,CArray<double> &ArrDepth,CArray<double> &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<CPoint2D>& PtsVec);
/*使用SetReUnDoAction时会使用存档井柱对象进行替换操作所以此句代码前获得的井柱指针都重新获取一次*/
virtual void SetReUnDoAction(BOOL bNoSaveData = TRUE, UINT actionType = IDS_STRING_ACTION_MOVE, CWellBaseObj* pWellBase = NULL);
BOOL IsAddFaultPoint();
void SetAddFaultPoint();
BOOL IsEnableAddFaultPoint();
BOOL ApplingFileTemplate(CKXmlParse& xp);
void DrawMovedTrackPicture(CDC* pDC);
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);
////获得组合道中最右边的道
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<CXyDC*> m_DcVec; //当与多个窗体相关时放置多个窗体的DC
std::vector<CWnd *> m_WndVec;
LOGFONT m_logFont;
BOOL m_bAddFaultPoint;
};
};