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.

741 lines
29 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.

//////////////////////////////////////////////////////////////////////////////
//文件 Xy.h
//主要功能:
//
//程序编写: 2005-12-07
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include <map>
#include "afxdb.h"
#include "xydc.h"
#include "rect8ex.h"
#include "afxcoll.h"
#include ".\classlist.h"
#include "..\projectionLib\projection.h"
#include ".\fileencrypt.h"
#include "MapStringToPtrNoCase.h"
#include "XyElementFilter.h"
#include <unordered_map>
#include "Util.h"
#include "VtkSettings.h"
#include <optional>
// 金东方二进制文件头,魔数
#define KEVISUALIZATION_BINARY 1001101
#define XY_STYLE_DERIVED_LEGEND 0x0001 //继承修饰,是不是应该改为控制每个层的修饰继承问题
#define XY_STYLE_LAYER_SORT 0x0002 //按类别显示元素
class CCgmDefaultInfo //为了读取CGM等其它格式文件时,能在DOC中正确设置显示比例而增加
{
public:
CCgmDefaultInfo()
{
mode=-1;
scaling=1;
};
int mode;
double scaling;
};
class COne;
class AFX_EXT_CLASS CXy
{
public:
CXy();
virtual ~CXy();
virtual void Clear(void);
public:
NBase::CRect8 m_markRect; //当为符号时, 表示符号的范围, 为了在CInsertDraw中显示时更加准确
NBase::CRect8 m_range; //图件的范围
NBase::CRect8 m_display; //当前的显示范围
short m_version; //读取的版本号
NBase::CSize8 m_scaleSize; //图件的横纵比例
CSize m_unit; //x,y方向的单位选择
CString m_strName; //图件名称
CString m_strMaker; //制作人
CString m_strDate; //图件制作日期
double m_dScaleFactor; //比例因子,当前图件的比例值1m_dScaleFactor
long color;
CMapStringToPtrNoCase mark;
void* m_DataClassAppend; //附加的分类方案
CHowToViewCurve* HowToViewCurve;//曲线修饰
CHowToViewPoint* HowToViewPoint;//点修饰
CProjection m_ExchangeXYZ; //投影
CString projection;
//CMeshPackage* m_pMeshPackage; // 网格补丁
BOOL m_bRealTimeDraw; // 读取文件时是否实时生成图形,例如网格等
COLORREF m_symbolBackcolor = 16777216; // 符号背景充填颜色
COLORREF m_symbolForecolor = 16777216; // 符号背景充填颜色
protected:
std::unique_ptr<CFileEncrypt> m_pEncrypt; //加密处理
CLayer* m_pLayer; //CLayer*CXy
BOOL m_bXyDrawContinue; //自动DRAW标志,当为FALSE时,停止DRAW函数返回
int m_tempViewState; //元素的显示状态(临时)
double m_RedundantError; //冗余误差
DWORD m_dwFlags; //风格,如继承修饰,是否按层显示元素等,为了便于扩展
POSITION AddElement(COne* pOne);
CPtrList value; //所有元素列表???内存泄漏
CClassList m_ClassList; //所有类别列表
virtual COleObject* ReadOleData(CFile& fr, const short &ver);
BOOL m_bEnablePackage = FALSE;
CString m_faultLayer; // 断层图层
CString m_borderLayer; // 边界图层
CString m_meshLayer3D; // 背景图层
CString m_faultLayer3D; // 断层图层
CString m_borderLayer3D; // 边界图层
CString m_wellLayer3D; // 井图层
int64_t m_mainMeshId3D = -1;
public:
CPtrList m_printTemplateList; //文件中的打印模板列表
//为了扩展类定义
void* CreateExtendObject(int nType); //return CBaseExtend*
int FindExtendType(LPCTSTR lpszKey);
bool CreateMeshPackage();
void EnableMeshPackage(BOOL enable,BOOL force = FALSE);
bool IsEnableMeshPackage() { return this->m_bEnablePackage; }
void SetFaultLayer(CString layer);
CString GetFaultLayer();
void SetBorderLayer(CString layer);
CString GetBorderLayer();
void SetMeshLayer3D(const CString& layer);
const CString& GetMeshLayer3D() const;
void SetFaultLayer3D(const CString& layer);
const CString& GetFaultLayer3D() const;
void SetBorderLayer3D(const CString& layer);
const CString& GetBorderLayer3D() const;
void SetWellLayer3D(const CString& layer);
const CString& GetWellLayer3D();
void SetMainMeshId3D(int64_t id);
int64_t GetMainMeshId3D() const;
public:
BOOL ReadOtherWithExtension(LPCTSTR lpstrFileName, CCgmDefaultInfo* pCgmInfo=NULL); //根据扩展名自动识别格式并读取,不包括dfd,dfb,xyz等格式
BOOL ReadOtherWithExtension(CFile& fr, CString ext, CCgmDefaultInfo* pCgmInfo/*=NULL*/);
/**
* 注意!读取文件有 bug会改符号大小
*/
BOOL ReadWithExtension(LPCTSTR lpstrFileName); //根据扩展名自动识别双狐格式并读取
BOOL ReadMemory(BYTE* bufFile, int bufLen, int formatCode); // formatCode: 1=dfd, 2=dfb, 3=dml, 4=pcg
BOOL WriteMemory(BYTE*& bufFile, int& bufLen, int formatCode); // formatCode: 1=dfd, 2=dfb, 3=dml, 4=pcg
BOOL WriteMemory(BYTE*& bufFile, int& bufLen, NBase::CPositionList& select, int formatCode, const short& ver);
void SaveAsWithExtension(LPCTSTR lpszFileName, short ver=-1, BOOL bWriteAllLayerName=TRUE);
POSITION ReadImageRecognise(LPCTSTR lpcsImageName); //自动识别图象文件
CImageInsert* FromImage(LPCTSTR lpcsImageName);
CMetaFile* FromWMF(LPCTSTR lpcsWmfName);
CMxn* FromSegy(LPCTSTR lpszSegyName);
CSection* FromSegyMemory(LPCTSTR lpszSegyName, BOOL bReadCoor=FALSE, int posx=72, int posy=76);
int DFD_ReadOnlyCurveLayer(LPCTSTR lpstrFileName); //只读取文件中的层位、曲线、修饰信息
int FromCgm(LPCTSTR lpszPathName, CCgmDefaultInfo* pCgmInfo=NULL); //从类CCgm中获得数据,pCgmInfo为CGM中的比例参数
int FromCgm(CFile& fr, CCgmDefaultInfo* pCgmInfo=NULL); //从类CCgm中获得数据,pCgmInfo为CGM中的比例参数
int FromShp(LPCTSTR lpszPathName); //从ArcView中的SHP文件中获得数据
int FromMif(LPCTSTR lpszPathName); //从MapInfo中的Mif文件中获得数据
int FromDxf(LPCTSTR lpszPathName); //从AutoCAD中的DXF文件中获得数据
int FromDxf(CFile& fr); //从AutoCAD中的DXF文件中获得数据
int FromUmapAsc(LPCTSTR lpszPathName); //从UMap的明码交换格式获得数据asc
int FromUmapBlk(LPCTSTR lpszPathName); //从UMap的明码交换格式获得数据blk
int FromMapGis(LPCTSTR lpszPathName); //从MapGis中的明码格式文件中获得数据
int FromGeoMap(LPCTSTR lpszPathName); //从GeoMap明码格式文件中获得数据
int FromZgf(LPCTSTR lpszPathName); //从ZMAP的ZGF格式中获得数据
int FromGridAuto(LPCTSTR lpszFileName); //自动识别GRID文件进行读取(*.grd,*.grid)
int FromGeoFrame_Map(LPCTSTR lpszPathName); //读取GeoFrame的Map文件
int FromEmf(LPCTSTR lpszPathName); //读取EMF文件
int FromGDBX(LPCTSTR lpszPathName); //读取GDBX文件(xml引擎)
int ToCgm(CXyDC* pXyDC, CFile& fw); //保存CGM文件
int ToCgm(CXyDC* pXyDC, LPCTSTR lpszPathName); //保存CGM文件
int ToEps(CXyDC* pXyDC, CFile& fw); //保存EPS文件
int ToEps(CXyDC* pXyDC, LPCTSTR lpszPathName); //保存为EPS文件;
int ToPdf(CXyDC* pXyDC, CFile& fw, const NBase::CRect8& pRect,
bool state, int cType, int sType); //保存PDF文件
int ToPdf(CXyDC* pXyDC, LPCTSTR lpszPathName, const NBase::CRect8& pRect,
bool state, int cType, int sType); //保存为PDF文件
int ToDxf(CXyDC* pXyDC, CFile& fw); //保存DXF文件
int ToDxf(CXyDC* pXyDC, LPCTSTR lpszPathName); //保存为DXF文件;
int ToUmap(CXyDC* pXyDC, CFile& fw); //保存为UMap文件,为海油增加
int ToMapGisAsc(CXyDC* pXyDC, CFile& fw, BOOL bCreateLayerFile); //保存MapGis明码文件
int ToMapGisAsc(CXyDC* pXyDC, LPCTSTR lpszPathName, BOOL bCreateLayerFile); //保存为MapGis明码文件;
int ToKML(CFile& fw); //保存google KML文件
int ToGeoMap(CXyDC* pXyDC, CFile& fw); //保存GeoMap的GDB文件
int ToGeoMap(CXyDC* pXyDC, LPCTSTR lpszPathName); //保存GeoMap的GDB文件
int ToGDBX(CXyDC* pXyDC, CFile& fw);
/////////////////////DML格式////////////////////////////////////////////////////////////////////////////
public:
virtual int DML_Read(CString m_input, short ver=-1);
virtual int DML_Read2(CFile& fr, short ver=-1); //XML文件读写
virtual int DML_Read(CFile& fr, short ver=-1); //XML文件读写
virtual int DML_ReadData(CFile& fr, short ver=-1);
virtual int DML_Write(CFile& fw, NBase::CPositionList& select, short ver=-1);
virtual int DML_Write(CFile& fw, short ver=-1, BOOL bWriteAllLayerName=TRUE, int nBaseTabNum=0);
virtual int DML_WriteAll(CFile& fw, short ver=-1, BOOL bWriteAllLayerName=TRUE);
virtual int DML_Write(LPCTSTR lpszFileName, short ver=-1, BOOL bWriteAllLayerName=TRUE);
virtual void DML_WriteData(CFile& fw, short ver, BOOL bWriteAllLayerName, int nBaseTabNum);
void DML_WriteViewState(CFile &fw, int view_state, short ver, int nBaseTabNum);
void DML_Write(CProjection& pj, CFile& fw, short ver, int nBaseTabNum);
int DML_Read(CProjection& pj, CFile& fr, short ver);
protected:
int DML_ReadSectionHead(CFile& fr, short ver=-1);
int DML_ReadSectionSymbols(CFile& fr, short ver=-1);
int DML_ReadSectionClasses(CFile& fr, short ver=-1);
int DML_ReadSectionLayers(CFile& fr, short ver=-1);
int DML_ReadSectionEmbellish(CFile& fr, short ver=-1);
int DML_ReadSectionData(CFile& fr, short ver=-1);
int DML_ReadSectionTail(CFile& fr, short ver=-1);
private :
void DeSerialize(CArchive& ar);
/////////////////////大庆PCG格式////////////////////////////////////////////////////////////////////////////
public:
void AddEmbed(COne* pOne,CXy* pXy= NULL); //将一个井或剖面的COne以一个嵌入元素引入xy
void PCG_InsertWellOrSectionToMap(CString filePath, CXyDC * pdc); //导入pcg格式的井或剖面图
std::vector<COne*> & GetLatestReadOnes(); //ggff
virtual int PCG_Read2(CString filePath, short ver = -1); //XML文件读写
virtual int PCG_Read(CString m_input, short ver=-1);
virtual int PCG_Read2(CFile& fr, short ver=-1); //XML文件读写
virtual int PCG_Read(CFile& fr, short ver=-1); //XML文件读写
int Pcg2_ReadPlaneMap(CFile& fr, short ver); // PCG2.0
virtual int PCG_ReadData(CFile& fr, short ver=-1, void * pXy=NULL);
virtual int PCG_Write(CFile& fw, CPositionList& select, short ver=-1);
virtual int PCG_Write(CFile& fw, short ver=-1, BOOL bWriteAllLayerName=TRUE, int nBaseTabNum=0);
virtual int PCG_WriteAll(CFile& fw, short ver=-1, BOOL bWriteAllLayerName=TRUE);
virtual int PCG_Write(LPCTSTR lpszFileName, short ver=2, BOOL bWriteAllLayerName=TRUE);
virtual void PCG_WriteData(CFile& fw, short ver, BOOL bWriteAllLayerName, int nBaseTabNum);
virtual void PCG2_WriteData(CFile& fw, short ver, BOOL bWriteAllLayerName, int nBaseTabNum);
void PCG_WriteViewState(CFile &fw, int view_state, short ver, int nBaseTabNum);
void PCG_Write(CProjection& pj, CFile& fw, short ver, int nBaseTabNum);
int PCG_Read(CProjection& pj, CFile& fr, short ver);
virtual int PCG_ReadWellColumn(CFile& fr, short ver = -1); //ggff2025
virtual int PCG_WriteWellColumn(CFile& fw, short ver = -1);
virtual int PCG_ReadCrossSection(CFile& fr, short ver = -1);
virtual int PCG_WriteCrossSection(CFile& fr, short ver = -1);
protected:
int PCG_ReadSectionHead(CFile& fr, short ver=-1);
int PCG_ReadSectionSymbols(CFile& fr, short ver=-1, void * pXy=NULL);
int PCG_ReadSectionClasses(CFile& fr, short ver=-1);
int PCG_ReadSectionLayers(CFile& fr, short ver=-1);
int PCG_ReadSectionEmbellish(CFile& fr, short ver=-1);
int PCG_ReadSectionData(CFile& fr, short ver=-1);
int PCG_ReadSectionTail(CFile& fr, short ver=-1);
int PCG2_ReadSectionLayers(CFile& fr, short ver = -1);
int PCG2_ReadSectionData(CFile& fw, short ver = 2, void *pXy=NULL);
int PCG2_ReadElement(CFile& fr, short ver = 2);
/////////////////////双狐格式////////////////////////////////////////////////////////////////////////////
public:
bool OpenFile(LPCTSTR lpszFileName, bool realTimeDraw);
virtual void DFB_Serialize(CArchive& ar, short ver, BOOL bWriteAllLayerName=TRUE);
virtual void DFB_WriteData(CArchive& ar, short ver);
int DFB_SerializeRead(CString strInput);
int DFB_SerializeWrite(CString strOutput, short ver, BOOL bWriteAllLayerName=TRUE);
/* @brief 写双狐二进制格式 */
int DFB_SerializeWrite(CArchive& ar, short ver, BOOL bWriteAllLayerName=TRUE);
int DFB_Read (CArchive& ar, NBase::CPositionList& select, short ver); //扩展读select中为读到元素在当前中的位置
int DFB_Write(CArchive& ar, NBase::CPositionList& select, short ver);
int DFB_Read(CArchive& ar, int type, const short& ver);
void DFB_Write(CArchive& ar, int type, const short& ver);
uint64_t DFB_ReadHeader(CArchive& ar);
void DFB_WriteHeader(CArchive& ar, uint64_t header);
int16_t DFB_ReadVersion(CArchive& ar);
void DFB_WriteVersion(CArchive& ar, int16_t ver);
int DFD_WritePureData(CFile& fw, int selType);
void DFB_ReadEncrypt(CArchive& ar, short ver=-1);
void DFB_WriteEncrypt(CArchive& ar, short ver=-1);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
virtual int KEV_Read(CString m_input, short ver = -1);
virtual int DFD_Read(CString m_input, short ver=-1);
virtual int DFD_Read(CFile &fr, short ver=-1);
virtual int DFD_Read2(CFile &fr, short ver=-1); //转换为CStdioFile类进行读取,速度比CFile类要快
virtual int DFD_Write(CString m_output, short ver=-1, BOOL bWriteAllLayerName=TRUE);
virtual int DFD_Write(CFile& fw, short ver=-1, BOOL bWriteAllLayerName=TRUE);
virtual int DFD_Write2(CFile& fw, short ver=-1, BOOL bWriteAllLayerName=TRUE); //转换为CStdioFile类进行写,速度比CFile类要快
virtual void DFD_WriteData(CFile& fw, short ver, BOOL bWriteAllLayerName);
void DFD_WriteViewState(CFile &fw, int view_state, short ver=-1);
int DFD_Read (CFile &fr, NBase::CPositionList& select, short ver = -1); // 扩展读select中为读到元素在当前中的位置
int DFD_Write(CFile& fw, NBase::CPositionList& select);
void DFD_Write(CFile& fw, POSITION pos, const short &ver, BOOL bWriteColor=TRUE);
void DFD_WriteLegend(CFile& fw, short ver, double cc=1.0);
void DFD_WriteMark(CFile& fw, short ver, double cc = 1.0);
int DFD_WriteViewData(CFile& fw, short ver);
//type= PLINE_CLOSE 保存关闭,
// PLINE_SOLID 保存充填
int DFD_WriteSelectPline(CFile& fw, short ver, int type, BOOL bIncludeEmbellish);
//outType=0为曲线与点全部输出,为DOUBLEFOX_CURVE输出线,为DOUBLEFOX_POINT输出点
int DFD_WriteXYZ(CFile& fw, int outType=0, char split=',', int nOutMode=0);
int DFD_WriteSelectData(CFile& fw, int selType, short ver=-1);
int DFD_WritePurePline(CFile& fw, short ver=-1);
int DFD_WritePlineSmooth(CFile& fw, NBase::CPositionList& select, double step, int bIsBezier); //将曲线转换为B样条或S样条
void DFD_WriteVersion(CFile& fw, const short& ver); //写当前版本号
void DFD_WriteProjection(CFile& fw); //写投影信息
void DFD_WriteUnit(CFile& fw);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int ReadCurveBinary(CString strBinaryName, double dRedundantError=-1); //读取CCurveBinary文件到当前XY中
// int WritePointToDB(CDatabase& db, CString strTableName, CString date);
// int WritePlineToDB(CDatabase& db, CString strTableName, CString date, BOOL IsNodeRecord /*=TRUE*/);
int Convert2Visibility(int viewStatus);
CString Convert2TypeName(int elementType);
public:
CFileEncrypt* GetFileEncrypt(void);
BOOL IsEncrypted(void);
virtual void Draw(CXyDC& dc, POSITION p);
virtual void Draw(CXyDC& dc, bool bSetProgressPos=false);
virtual void DrawLayerSort(CXyDC& dc, bool bSetProgressPos=false);
void Draw(CXyDC& dc, NBase::CPositionList& select);
virtual POSITION AddElement(void *pElement,int m_type);
virtual POSITION IsInRange(NBase::CRect8& range);
virtual void operator=(CXy& xy);
COne* CreateOne(void* pElement, int type);
void GetOneParameter(COne* pOne);
NBase::CRect8 GetRange(void);
NBase::CRect8 GetRange(NBase::CPositionList& select);
NBase::CRect8 GetDisplayRange(void); //获得显示范围
void GetRange(NBase::CPoint3D& minPoint, NBase::CPoint3D& maxPoint);
void GetRange(NBase::CRect8& rect, BOOL bIncludeNoView=TRUE);
int IsInRange(NBase::CRect8& range, NBase::CPositionList &select, BOOL bIsOnlyEnable=TRUE);
int IsInRange(NBase::CRect8& range, NBase::CPositionList &select, int nElementType, BOOL bIsOnlyEnable);
BOOL IsDrawContinue(void);
void SetDrawContinue(BOOL bDraw);
CPtrList* GetValueList(void);
int GetCount(void);
// 计算范围内的倾角
double GetSurfaceAngle(CCurveEx& curve);
///////////////////////////////////////////////////////////////////////////////////////////////////
//层位操作函数
void InitLayerClass(void);
CClassList* GetClassList(void);
int GetLayerCount(void);
int SetLayerState(CString sLayer, int state, BOOL bIncludeSubLayer=FALSE);//返回设置状态层的个数
CLayerList* GetClass(POSITION pos);
CLayerList* GetClass(CString strClassName);
CLayerList* AddClass(CString strClassName);
virtual CLayer* FindAddLayer(CString name, bool* pbCreateNew = NULL); //先查找有没有该层,如果有则返回已有层的位置
virtual CLayer* AddLayer(CLayer* pl);
POSITION FindClass(CString strClassName);
CLayer* FindLayer(CString name, BOOL bWithSubLayer = FALSE);
void FindLayers(CString name, CPtrList& layers, BOOL bWithSubLayer = FALSE);
CLayer* GetAtLayer(POSITION pos);
CLayer* GetCurrentLayer(void);
void SetCurrentLayer(CString sLayer);
void SetCurrentLayer(CLayer* pLayer);
int GetLayerUsing(CStringList& arrValue); //获得有数据的类别名
/**
*
* 获得指定层(包括该层)下的所有层位指针
* \param LayerList 出参,获取到的图层指针
* \param strLayerName 图层名,当只有 CLass Name 没有图层名的时候,将查所有,这时 bWithSubLayer 无意义
* \param bWithSubLayer 是否包含子层名
* \param bRemoveAtNoClear 是否要把获取到的图层从 ClassList 中移除出去
* \return
*/
int GetLayer(CPtrList& LayerList, CString strLayerName, BOOL bWithSubLayer=TRUE, BOOL bRemoveAtNoClear=FALSE);
int ReplaceLayer(CString strOld, CString strNew, BOOL bWord, BOOL bCase);
void RemoveLayer(CString strLayerName, BOOL bWithSubLayer=TRUE, BOOL bRemoveData=TRUE);
//相同级别间类别的移动,仅是层位顺序的调整
int MoveLayerInSameClassSeries(CString strSourceLayer, BOOL bWithPosition=FALSE, POSITION posInsert=NULL, int nMode=0); //Before:nMode==0,After:nMode=1
//不同级别间类别的移动
int MoveLayer(CString strSourceLayer, CString strParentDestLayer, BOOL bWithPosition=FALSE, POSITION posInsert=NULL, int nMode=0);//Before:nMode==0,After:nMode=1
int MoveClassLayer(CString strSourceClass, CString strParentDestLayer, BOOL bWithPosition=FALSE, POSITION posInsert=NULL, int nMode=0);//Before:nMode==0,After:nMode=1
int MoveLayerToClass(CString strSourceLayer, CString strDestClass, BOOL bWithPosition=FALSE, POSITION posInsert=NULL, int nMode=0);//Before:nMode==0,After:nMode=1
protected:
/**
* 将 listTemp 图层插入到plcd中
*
* \param listTemp 要插入的图层列表,里面必须是 CLayer 指针
* \param plcd 图件上的图层列表
* \param bWithPosition 是否插入到指定位置,如果这个为 false将插入到 plcd 的末尾
* \param posInsert 要插入的位置
* \param nMode 0 插入到 posInsert 前面1 插入到 posInsert 后面
*/
void MoveLayer(CPtrList& listTemp, CLayerList* plcd, BOOL bWithPosition, POSITION posInsert, int nMode);
public:
int ReplaceElementLayer(CLayer* pOldLayer, CLayer* pNewLayer);
///////////////////////////////////////////////////////////////////////////////////////////////////
POSITION InsertElementBefore(POSITION pos, COne* pNewOne);
POSITION InsertElementBefore(POSITION pos, void* pElement, int nType);
POSITION InsertElementAfter(POSITION pos, COne* pNewOne);
POSITION InsertElementAfter(POSITION pos, void* pElement, int nType);
POSITION AddTailOne(COne* pOne);
POSITION AddHeadOne(COne* pOne);
//插入到posInsertAfter指定的位置之后,为NULL时表示增加在最后
int MoveIn(CXy* pxy,
NBase::CPositionList& elemList,
POSITION posInsertAfter=NULL,
CPtrList* pAddedMarkList=NULL,
CPtrList* pAddedLayerList=NULL,
bool bRepositionMark = true,
bool bReplaceExistLayer = false, //将pxy中的对象全部移进来
bool removeFromSource = true); // 从源中清除移进来的数据
int MoveInBottom(CXy* pxy,
NBase::CPositionList& elemList,
CPtrList* pAddedMarkList = NULL,
CPtrList* pAddedLayerList = NULL,
bool bRepositionMark = true,
bool bReplaceExistLayer = false); //将pxy中的对象全部移进来
int MoveInBefore(CXy* pxy, NBase::CPositionList& elemList, const CString& destLayerName,
CPtrList* pAddedMarkList = NULL,
CPtrList* pAddedLayerList = NULL,
bool bRepositionMark = true,
bool bReplaceExistLayer = false);
int MoveInBefore(CXy* pxy, NBase::CPositionList& elemList, POSITION pos,
CPtrList* pAddedMarkList = NULL,
CPtrList* pAddedLayerList = NULL,
bool bRepositionMark = true,
bool bReplaceExistLayer = false);
int MoveInAfter(CXy* pxy, NBase::CPositionList& elemList, const CString& destLayerName,
CPtrList* pAddedMarkList = NULL,
CPtrList* pAddedLayerList = NULL,
bool bRepositionMark = true,
bool bReplaceExistLayer = false);
POSITION MoveToFront(POSITION pos); //最上显示
POSITION MoveToBack(POSITION pos); //最下显示
POSITION MoveForward(POSITION pos); //上移一层
POSITION MoveBackward(POSITION pos); //下移一层
void ChangeToProjection(CString strProjection); //根据当前投影转换到指定投影
void SetProjection(CString strProjection); //设置当前的投影方式
CString GetProjection(void);
void SetUnit(int unitx, int unity);
void SetUnit(CSize unit);
CSize GetUnit(void);
void SetElementColor(POSITION pos, COLORREF newColor);
long GetElementIndex(POSITION pos);
void GetElementIndexs(const std::vector<POSITION> positions, std::vector<long> &indexs) const;
POSITION FindIndex(long index);
int GetElementType(POSITION pos);
CLayer* GetElementLayer(POSITION pos);
BOOL SetElementLayer(POSITION pos, CLayer *pl);
BOOL SetElementLayer(POSITION pos, CString sLayer);
int SetElementState(POSITION pos, int nState); //设置元素显示状态
void RemoveAt(COne* pOne);
void RemoveAt(POSITION pos);
COne* RemoveAtNoClear(POSITION pos);
BOOL RemoveAtNoClear(COne* pOne);
COne* SetAt(POSITION pos, COne* pOne);//返回老的
COne* GetAt(POSITION pos) const;
void* GetAtValue(POSITION pos);
void RemoveAllLegend(void);
void RemoveAllLayer(void);
void RemoveAllData(void);
void RemoveAllPrintTemplate(void);
int ClearNoUseMark(CPtrList* ptrNoUseMark = NULL); //清除不使用的符号符号指针移动到了参数ptrNoUseMark中
int ClearLayerNoneData(CPtrList* pNoneDataLayerList = NULL); //删除没有数据的类别名
//符号操作
int AddMark(CXy* pxy, BOOL bDeleteOld=TRUE);
void RemoveMark(CString key);
void* RemoveMarkNoClear(CString key);
CMapStringToPtrNoCase* GetMark(void);
void* FindMark(CString key);
POSITION FindElement(CString name); //查找指定名称的元素
//bReplace=0 时表示不管符号指针是否为空都重新定位符号指针
//bReplace=1 时表示符号指针不为空才根据符号名称重新定位符号指针
//bReplace=2 时表示符号指针不为空时根据符号指定的名称重新设定插入的符号名称
int PositionNew(int bReplace=1);
void GetNewUsing(CStringList& arrValue); //获得正在使用的符号名称
BOOL SetSectionColor(long bkColor, long frSolidColor, long frLineColor);
/**
* 获取 {slayer} 图层的图元 POSITION
*
* \param slayer 图层名称
* \param select 出参,图元的坐标,可以通过 GetAt 获取到 COne *
* \param bWithSubLayer 是否包含子层
* \param bIncludeNoEdit
* \return
*/
int GetElement(CString slayer, NBase::CPositionList& select, BOOL bWithSubLayer=FALSE, BOOL bIncludeNoEdit=TRUE);
/**
* 获取画布中所有类型为 {nElementType} 的图元位置
*
* \param nElementType 图元类型,即 COne 的类型
* \param select 出参,图元的坐标,可以通过 GetAt 获取到 COne *
* \param bWithSubLayer 是否包含子层
* \return
*/
int GetElement(int nElementType, NBase::CPositionList& select, BOOL bIncludeNoEdit=FALSE);
/**
* 获取 {pLayer} 图层类型为 {nElementType} 的图元位置
*
* \param pLayer 图层
* \param select 出参,图元的坐标,可以通过 GetAt 获取到 COne *
* \param nElementType 图元类型,即 COne 的类型,为 0 时表示获取所有类型
* \param bWithSubLayer 是否包含子层
* \return
*/
int GetElement(CLayer* pLayer, NBase::CPositionList& select, int nElementType=0, BOOL bWithSubLayer=FALSE);
/**
* 复杂条件过滤,如果上面三个过滤不满足需求,可以考虑使用这个过滤函数
*
* \param filter 过滤条件 当filter不设任何值 返回全部元素列表
* \param select 符合条件的图元列表
* \return
*/
int GetElement(const CXyElementFilter &filter, NBase::CPositionList &select) const;
/**
* 复杂条件过滤,和上个函数不同的是,我们不是从所有图元而是从 source 中筛选符合条件的图元
*
* \param filter 过滤条件
* \param select 符合条件的图元列表
* \return
*/
int GetElement(const NBase::CPositionList &source, const CXyElementFilter &filter, NBase::CPositionList &select) const;
/**
* 复杂条件过滤,支持更加灵活的条件表达式,同时更容易扩展
* 不过使用成本也更高,更容易出错,性能也比上一个略低,适合在一些特殊场景使用
*
* \param filter 过滤对象
* \param select 符合条件的图元列表
* \return 符合条件的元素个数
*/
int GetElement(std::shared_ptr<ElementFilter> filter, NBase::CPositionList &select) const;
/**
* 根据 id 获取 POSITION
*
* \param id 图元 id
* \return 如果存在,返回指定的 POSITION否则返回 nullptr
*/
POSITION GetPositionById(int64_t id) const;
/**
* 通过 id 获取图元
*
* \param id
* \return 如果存在,返回应图元指针,否则返回 nullptr
*/
COne* GetOneById(int64_t id) const;
/**
* 判断 COne 是否符合筛选条件
*
* \param pOne
* \param filter
* \return
*/
bool MatchFilter(COne* pOne, const CXyElementFilter& filter) const;
CHowToViewCurve* GetCurHowToViewCurve(void);
CHowToViewPoint* GetCurHowToViewPoint(void);
void SetCurHowToViewCurve(CHowToViewCurve* pHTVC);
void SetCurHowToViewPoint(CHowToViewPoint* pHTVP);
CHowToViewCurve* GetDeriveHowToViewCurve(CString sPathName);
CHowToViewPoint* GetDeriveHowToViewPoint(CString sPathName);
BOOL IsDeriveLegend(void);
void EnableDeriveLegend(BOOL bDerive);
BOOL IsLayerSort(void);
void EnableLayerSort(BOOL bEnable);
CHyperlink* GetHyperlink(POSITION pos);
POSITION Find(COne* pOne, POSITION startAfter=NULL);
COne* FindCurve(CString name);
COne* FindPoint(CString name);
POSITION FindFirstElement(int nType);
void DisplayReversal(void);
int DisplayAll(BOOL bIsView=TRUE, int nTypeSelect=0);
void SetRedundantError(double error);
double GetRedundantError(void);
void Rotate(double xs, double ys, double angle);
void ScaleProperty(double sx, double sy, BOOL bPersonalEmbellish, BOOL bOwnerProperties, BOOL bJudgeEditSatte=TRUE);
void ScaleCoor(double xs,double ys,double dx,double dy);
void Offset(double dx, double dy);
void ScaleCoordinate(double sx, double sy, int mode=0); //mode=0:加1:减2:乘3:除
// type为校正类型,比如两点校位、四点校位等;value为类对象指针如CCalibrate2、CCalibrate4等
void Calibrate(int type, void* pValue);
int Replace(COLORREF cOldColor, COLORREF cNewColor, BOOL bOwnerProperties, BOOL bLayerEmbellish);
int SetColor(COLORREF cNewColor, BOOL bOwnerProperties, BOOL bLayerEmbellish); //设置所有的文字、曲线等颜色
static int RedundantCurve(LPCTSTR lpszInputFileName, LPCTSTR lpszOutputFileName, double dError);
void* FindStation(LPCTSTR lpStrLineName); //发现速度谱中某测线的CStation对象
CProgressCtrl* GetProgress(void);
//速度编辑相关函数
int ReadTV(CString m_input);
void SetVelocityMode(int xMode, int yMode);
DWORD GetVelocityStyle(void);
void SetVelocityStyle(DWORD dwStyle);
int m_xMode;
int m_yMode;
void ExchangeXY(void);
static void RemoveAllXy(CMapStringToPtrNoCase& map);
int MetaToImage(CMetaFile* pMeta, CImageInsert& image);
CString m_FileName;
////////////发送接收WM_COPYDATA信息时的文件读取模式参数 pCopyDataStruct->dwData/////////////////
////新建文件
// 0://DML
// 1://DFD
// 2://DFB
////合并文件
// 10://DML
// 11://DFD
// 12://DFB
////合并文件并统一投影
// 20://DML
// 21://DFD
// 22://DFB
//hReceiveWnd为接收信息的窗口wParam可以为发送信息的窗口句柄createMode为文件读取模式
BOOL SendMessage_CopyData(HWND hReceiveWnd, WPARAM wParam=0, int createMode=2);
BOOL ReceiveMessage_CopyData(COPYDATASTRUCT* pCopyDataStruct);
//////////////////////////////////////////////////////////////////////////////////////////////////
std::unique_ptr<VtkSceneParameterSettings> vtkSceneParameterSettings;
private:
void DFB_SerializeCOnes(CArchive& ar, const short& ver);
void AssignLayerToCOne(COne* pOne, std::unordered_map<CString, CLayer*, CStringHash>& layerCache);
POSITION EnsureUniqueIdWithPosition(POSITION pos, COne* pOne);
void DFD_ReadVtkSceneParameterSettings(CFile& fw, VtkSceneParameterSettings& settings);
void DFD_WriteVtkSceneParameterSettings(CFile& fr, const VtkSceneParameterSettings& settings);
void DFD_WriteKeyValue(CFile& fw, const char* key, bool value);
void DFD_WriteKeyValue(CFile& fw, const char* key, int value);
void DFD_WriteKeyValue(CFile& fw, const char* key, uint32_t value);
void DFD_WriteKeyValue(CFile& fw, const char* key, int64_t value);
void DFD_WriteKeyValue(CFile& fw, const char* key, double value);
void DFD_WriteKeyValue(CFile& fw, const char* key, const CString& value);
std::unordered_map<int64_t, POSITION> m_idMap;
std::vector<COne*> m_LatestReadingOnes; //ggff临时变量用来记录最新从pcg文件中的井或剖面对象
public:
enum XYTYPE
{ //ggff2025
plane,
wellPole,
wellSection
};
XYTYPE GetXyType() { return m_XyType; }
void SetXyType(XYTYPE type) { m_XyType = type; }
protected:
XYTYPE m_XyType;
public:
virtual int PCG_ReadData(CKXmlParse& xp, short ver = -1, void * pXy = NULL);
int PCG_Read3(CString strFilePath,short ver = -1); // (CFile& fr, short ver = -1);
virtual int PCG_ReadWellColumn(CKXmlParse& xp, short ver = -1); //ggff2025
virtual int PCG_ReadCrossSection(CKXmlParse& xp, short ver = -1);
int PCG_ReadSectionHead(CKXmlParse& xp, short ver = -1);
int PCG_ReadSectionSymbols(CKXmlParse& xp, short ver/*=-1*/, void * pXy);
int PCG_ReadSectionClasses(CKXmlParse& xp, short ver/*=-1*/);
int PCG2_ReadSectionLayers(CKXmlParse& xp, short ver/*=-1*/);
int PCG_ReadSectionLayers(CKXmlParse& xp, short ver/*=-1*/);
int PCG_ReadSectionEmbellish(CKXmlParse& xp, short ver/*=-1*/);
int PCG2_ReadSectionData(CKXmlParse& xp, short ver, void *pXy);
int PCG_ReadSectionData(CKXmlParse& xp, short ver/*=-1*/);
int PCG_Read(CProjection& pj, CKXmlParse& xp , short ver);
int PCG_ReadSectionTail(CKXmlParse& xp, short ver = -1);
protected:
int PCG3_Read(CKXmlParse& xp, short ver = -1);
int PCG3_ReadKevWellData(CFile& fr, int ver);
};
AFX_INLINE CPtrList* CXy::GetValueList(void)
{
return &value;
}
AFX_INLINE CClassList* CXy::GetClassList(void)
{
return &m_ClassList;
}
typedef void (* PFUN_NEW_OLE)(COleItem** pItem, COleObject **pObject);
extern "C" AFX_EXT_API PFUN_NEW_OLE * WINAPI AfxGetPFUN_NEW_OLE();