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.

299 lines
8.1 KiB
C

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD> CGDBXDraw.h
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д:
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "formatdc.h"
#include "../IDcDraw.h"
//#include "ClibPDF\cpdflib.h"
#ifndef M_PI
# define M_PI 3.14159265358979323846 /* pi */
#endif
#include "..\GdbxDefine.h"
#include "GeoMapGdbxWriter.h"
#include <unordered_map>
class CGDBXDraw :
public IDcDraw
{
public:
CGDBXDraw();
CGDBXDraw(CXyDC* pXyDC);
~CGDBXDraw();
void Create(CXyDC* pXyDC);
void InitDC();
void ReleaseDC();
void Close();
void SetGDBXData(CXy *xy);
void SetGDBXFilePath(const CString &path);
void Draw(CText& text, CCurveEx* pCurveRect = NULL) override;
void Draw(CText& text, COLORREF color) override; //<2F><><EFBFBD><EFBFBD>
void Draw(CMText& mtext) override;
void Draw(CEllipse& elp, COLORREF Color) override;
void Draw(CCircle& circle, COLORREF Color) override;
void Draw(CInsertDraw& m_insert) override; //- <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD>
void Draw(CXyDC* pNewXyDC, CInsertDraw& m_insert) override;
void Draw(CInsertOld& m_insert) override;
void Draw(CXyDC* pInsertXyDC, CInsertOld& m_insert) override;
void Draw(CSection& section, CRect8* rect = NULL) override;
void Draw(CImageInsert& image) override; //-<2D><><EFBFBD><EFBFBD>ͼ
void Draw(CMesh& mesh) override;
void Draw(CMetaFile& mf) override; //ԭ<>ļ<EFBFBD><C4BC><EFBFBD>emf<6D><66><EFBFBD>Ų<EFBFBD><C5B2>
void Draw(CColorRuler& ruler, CColorBase& color) override;
void Draw(CPathFill& path, COLORREF fillColor, void* HowToViewCurve) override;
void Draw(C3DFaultageSurface& fs, COLORREF fillColor, void* HowToViewCurve) override;
void Draw(CProportion& proportion, COLORREF color) override;
void Draw(CCurveEx& curve, double l1, double l2) override;
void Draw(CCurveEx& m_curve) override;
void Draw(CCurveEx& curve, void* HowToViewCurve) override; //-
void Draw(CCurveEx& curve, COLORREF color, BOOL bSmoothHead = TRUE) override; //-
void Draw(CCurveRect& rt, void* HowToViewCurve) override;
void Draw(CCurveRect& curve, COLORREF color) override;
void Draw(CPointNameEx& point, void* HowToViewPoint) override; //-
void Draw(CPointCrossName& point, void* HowToViewPoint) override; //
void Draw(CPointTwoName& point, void* HowToViewPoint) override;
void Draw(CInsertDrawRect& idr) override;
void Draw(CArc& arc, void* HowToViewCurve) override;
void Draw(CArc& arc, COLORREF color) override;
void Draw(CFrame& frame, COLORREF color) override; //- <20>߿򣨲<DFBF><F2A3A8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Draw(CNet& net, COLORREF colText, COLORREF colLine) override;
void Draw(CGridding& grid, COLORREF colText, COLORREF colLine) override; //- <20>߿<EFBFBD><DFBF><EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Draw(COtherDraw& od, void* HowToViewCurve) override;
void Draw(COtherDraw& od, COLORREF color) override;
void Draw(COleObject& ole) override;
void Draw(CTree& tree) override;
void Draw(CStation& cs) override;
void Draw(CCurveTV5& tv, void* HowToViewCurve) override;
void Draw(CScaleRuler& sr, COLORREF color) override;
void Draw(CRectLabel& rl, COLORREF color, void* HowToViewCurve) override;
void DrawArray(CMxn& mxn, COLORREF colFront, COLORREF colBack); //ǰ<><C7B0>ɫ<EFBFBD><EFBFBD><EBB1B3>ɫ
void Draw(CMxn& mxn, COLORREF colFront, COLORREF colBack);
void DrawGrid(CMxn& mxn);
void Draw(CHorizontalWell& horizontalwell, void* HowToViewCurve);
void Draw(CWellGroup& wellGroup);
void PolyLine(CPointList& dp);
void PaintRgn(LPPOINT sp, int count);
//<2F><><EFBFBD>Ƶ<EFBFBD>ǰGDBX<42>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>д<EFBFBD>뵽CustomSymbol<6F>ֶ<EFBFBD><D6B6>У<EFBFBD>
void DrawCurrentGDBXSymbol();
void WriteCurrentMarkXML(void *pDraw);
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>߶<EFBFBD>
void DrawSymbolCCurve(CCurveEx& curve, COLORREF color, pugi::xml_node& node);
//<2F><><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD>Բ
void DrawSymbolEllipse(CEllipse& ellipse, COLORREF color, pugi::xml_node& node);
//<2F><><EFBFBD>γ<EFBFBD><CEB3><EFBFBD>
void DrawGDBXFillRect(CRect8& rect, COLORREF color, const CString &lyerName);
//<2F><><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
void DrawGDBXProportionLine(std::vector<GDBXLINETO>& pointVec, CProportion& proportion, COLORREF color = 0);
//<2F><><EFBFBD>ֻ<EFBFBD><D6BB>ƣ<EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>ȣ<EFBFBD>
void DrawGDBXText(CText& text, COLORREF color, const CString &layerName, pugi::xml_node *parentNode = nullptr, int state = 0);
//<2F><><EFBFBD><EFBFBD><EFBFBD>߶Σ<DFB6>ɫ<EFBFBD>
void DrawGDBXLine(std::vector<GDBXLINETO>& pointVec, const CString &layerName, COLORREF color = 0);
//ɫ<><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DrawGDBXRulerImage(CColorRuler& ruler, CColorBase &color, COne *pOne);
//<2F><><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD>
void DrawGDBXCInserDraw(CPointNameEx& point, COne *pOne, CHowToViewPoint* hp);
//<2F><><EFBFBD><EFBFBD>Mesh
void DrawGDBXCImageInsert(CImageInsert& image, COne *pOne);
//<2F><><EFBFBD><EFBFBD>Mesh
void DrawGDBXCColorRuler(CColorRuler& ruler, CColorBase& color, COne *pOne);
//<2F><><EFBFBD>Ʊ߿<C6B1>
void DrawGDBXNormalGrid();
//<2F><><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD><EFBFBD><EFBFBD>(GDBX<42><58><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB><EFBFBD> ת<><D7AA><EFBFBD>в<EFBFBD><D0B2><EFBFBD>)
void DrawGDBXScale(CProportion& proportion, COLORREF color);
//<2F><><EFBFBD>Ʊ߿<C6B1>
void DrawGDBXGrid(CGridding& grid, COLORREF colText, COLORREF colLine);
//<2F>߿<EFBFBD><DFBF><EFBFBD><EFBFBD><EFBFBD>
void DrawGDBXGridPline(CGridding& grid, BOOL bDraw);
private:
void Clear();
//<2F><><EFBFBD>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
double DegreesToRadians(double degrees);
/**
* libarchive ѹ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
*
* \param gdbxPath gdbxȫ·<EFBFBD><EFBFBD>
* \param outPath <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ȫ·<EFBFBD><EFBFBD>
* \return
*/
int CompressGdbxDirectory(const CString& gdbxPath, const CString& outPath);
//gdbxͷ<78><CDB7><EFBFBD><EFBFBD>Ϣ
int createGDBXHead();
/**
* <EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Base64 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param lineList <EFBFBD><EFBFBD><EFBFBD>
* \param length <EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
* \return
*/
CString PolyDataMemoryBlock(const std::vector<GDBXLINETO>& lineList, int &length);
/**
* <EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Ϊʮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>ת<EFBFBD><EFBFBD>Ϊ 2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>дʮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
*
* \param pData
* \param nLength
* \return
*/
CString ByteArrayToHexString(const BYTE* pData, size_t nLength);
/**
* <EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vector<GDBXLINETO> <EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>Ϊʮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
*
* \param lineList <EFBFBD><EFBFBD><EFBFBD>
* \return
*/
CString EncryptBigPts(const vector<GDBXLINETO>& lineList);
/**
* <EFBFBD><EFBFBD><EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD>
*
* \param input <EFBFBD><EFBFBD>Ҫ<EFBFBD>ض<EFBFBD><EFBFBD>ַ<EFBFBD>
* \param num ÿ<EFBFBD>нضϳ<EFBFBD><EFBFBD><EFBFBD>
* \param lineCount <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* \return
*/
CString FormatStringWithLineBreaks(const CString &input,int lineWidth, int& lineCount);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ElementMap
*
* \param void *
* \return COne *
*/
COne* FindElementMap(void *pValue);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>±<EFBFBD><EFBFBD>ַ<EFBFBD>ת<EFBFBD><EFBFBD>
*
* \param cmd
* \return ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
*/
CString ReverseSuperAndSubConversion(CString cmd);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param markName
* \return int
*/
int FindMarkNumberMap(const CString& markName);
/**
* <EFBFBD><EFBFBD>ɫת<EFBFBD><EFBFBD>RGB->RGBA
*
* \param markName
* \return int
*/
COLORREF RGBToRGBA(COLORREF color);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_layerElement
*
* \param layerName
* \return pugi::xml_node
*/
pugi::xml_node FindLayerElementMap(const CString &layerName);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD>
*
* \return CString
*/
CString GetLayerListOrder();
/**
* ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
* \return int
*/
int RemoveAllGDBXDirPath();
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>xml<EFBFBD>Ԫ<EFBFBD><EFBFBD>
*
*/
void NewXmlElementLayer(const CString& strLayer);
/**
* <EFBFBD><EFBFBD><EFBFBD>ҲԪ<EFBFBD><EFBFBD>
*
*/
CString FindLayerName(COne *pOne);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
*
*/
void ComputeCurveName(CCurveEx &curve, CCurveName *pName, int state, const CString& layerName);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>geomap4.5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʋ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
*/
CString EnsureCsPrefix(const CString& synbolName);
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>block<EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><EFBFBD>޲
*
*/
CString FindBlockLayerName();
private:
int m_metaFileNum; //Ԫ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
int m_version;
int m_layerIndex; //<2F><>¼<EFBFBD>㼶˳<E3BCB6><CBB3>
long n_shapeIdCount;
long n_markShapeID; //<2F><><EFBFBD><EFBFBD>ShapeID<49><44><EFBFBD><EFBFBD>
double m_scale;
double m_paperW, m_paperH; //ͼֽ<CDBC><D6BD><EFBFBD><EFBFBD>mm
CRect8 m_rect;
CSize8 m_unit;
CSize8 m_markscale;
CRect8 m_gdbxMarkRect; //gdbx<62><78><EFBFBD>ŷ<EFBFBD>Χ
CString m_xmlPath; //gdbx xml<6D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
CString m_gdbxDirPath; //gdbx <20>ļ<EFBFBD><C4BC><EFBFBD>
CString m_filePath; //gdbx ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><C2B7>
CGeoMapGdbxWriter* p_gdbx;
pugi::xml_document m_doc;
pugi::xml_node m_mapNode;
pugi::xml_node m_layersNode;
pugi::xml_node m_customSymbolNode;
int m_markNumber;
std::unordered_map<std::string, int> m_markNumberMap;
std::unordered_map<void*, COne*> m_elementMap;
CMapStringToPtrNoCase* p_CurrentGlobalMark = nullptr; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
CLayerList* p_LayerList;
std::unordered_map<std::string, pugi::xml_node> m_layerElementMap; //ͼ<><CDBC><EFBFBD>
};