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.

242 lines
7.2 KiB
C

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD> CPdfDraw.h
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д:
/////////////////////////////////////////////////////////////////////////////
#pragma once
#include "formatdc.h"
#include "../IDcDraw.h"
#ifndef M_PI
# define M_PI 3.14159265358979323846 /* pi */
#endif
#ifndef M_PI_2
#define M_PI_2 (M_PI / 2.0)
#endif
#include "cairo/cairo.h"
#include "cairo/cairo-pdf.h"
#include <unordered_map>
class CPdfDraw :
public IDcDraw
{
public:
typedef struct
{
double x; //<2F>߶ε<DFB6><CEB5><EFBFBD>x
double y; //<2F>߶ε<DFB6><CEB5><EFBFBD>y
COLORREF Color; //<2F><>¼<EFBFBD>߶<EFBFBD>ɫ<EFBFBD><C9AB>
}CAIROPOINT;
enum class CairoFitMode
{
Center = 0, // <20><><EFBFBD><EFBFBD>
FitToPage = 1 // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>
};
enum class CairoSize
{
Cairo_A3 = 0,
Cairo_A4 = 1,
Cairo_A5 = 2,
Cairo_B4 = 3
};
public:
CPdfDraw();
CPdfDraw(CXyDC* pXyDC);
~CPdfDraw();
void Create(CXyDC* pXyDC);
void InitDC();
void ReleaseDC();
void Close();
void SetPdfData(CXy* pXy);
void SetPdfFilePath(const CString &path);
void SetPdfNumber(int num);
void Draw(CText& text, CCurveEx* pCurveRect = NULL); //<2F><>pCurveRect<63><74>Ϊ<EFBFBD><CEAA>ʱ<EFBFBD><CAB1>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Ϊ<EFBFBD>˻<EFBFBD><CBBB><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Χ
void Draw(CText& text, COLORREF color); //-<2D><><EFBFBD><EFBFBD>
void Draw(CMText& mtext);
void Draw(CEllipse& elp, COLORREF Color);
void Draw(CCircle& circle, COLORREF Color);
void Draw(CInsertDraw& m_insert); //-<2D><><EFBFBD>ž<EFBFBD><C5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ϣ<EFBFBD>
void Draw(CXyDC* pNewXyDC, CInsertDraw& m_insert);
void Draw(CInsertOld& m_insert);
void Draw(CXyDC* pInsertXyDC, CInsertOld& m_insert);
void Draw(CSection& section, CRect8* rect = NULL);
void Draw(CImageInsert& image); //-<2D><><EFBFBD><EFBFBD>
void Draw(CMesh& mesh);
void Draw(CMetaFile& mf);
void Draw(CColorRuler& ruler, CColorBase& color); //-ɫ<><C9AB>
void Draw(CPathFill& path, COLORREF fillColor, void* HowToViewCurve);
void Draw(C3DFaultageSurface& fs, COLORREF fillColor, void* HowToViewCurve);
void Draw(CProportion& proportion, COLORREF color); //-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Draw(CCurveEx& curve, double l1, double l2);
void Draw(CCurveEx& m_curve);
void Draw(CCurveEx& curve, void* HowToViewCurve); //-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Draw(CCurveEx& curve, COLORREF color, BOOL bSmoothHead = TRUE);//-<2D><>
1 month ago
void DrawVirtualCairo(CCurveEx &curve, CCurveProperties *type); //<2F><><EFBFBD><EFBFBD>
1 month ago
void Draw(CCurveRect& rt, void* HowToViewCurve);
void Draw(CCurveRect& curve, COLORREF color);
void Draw(CPointNameEx& point, void* HowToViewPoint); //-<2D><><EFBFBD>ž<EFBFBD>
void Draw(CPointCrossName& point, void* HowToViewPoint);
void Draw(CPointTwoName& point, void* HowToViewPoint);
void Draw(CInsertDrawRect& idr);//-
void Draw(CArc& arc, void* HowToViewCurve);//-
void Draw(CArc& arc, COLORREF color);//-
void Draw(CFrame& frame, COLORREF color); //- <20>߿򣨲<DFBF><F2A3A8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Draw(CNet& net, COLORREF colText, COLORREF colLine);
void Draw(CGridding& grid, COLORREF colText, COLORREF colLine); //- <20>߿<EFBFBD><DFBF><EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Draw(COtherDraw& od, void* HowToViewCurve);
void Draw(COtherDraw& od, COLORREF color);
void Draw(COleObject& ole);
void Draw(CTree& tree);
void Draw(CStation& cs);
void Draw(CCurveTV5& tv, void* HowToViewCurve);
void Draw(CScaleRuler& sr, COLORREF color);
void Draw(CRectLabel& rl, COLORREF color, void* HowToViewCurve);
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>ֵ<EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DrawPolylineName(const vector<CAIROPOINT>& points, const CString &name, double text_h, double position_distance = -1.0);
void SetMargins(double left, double right, double top, double bottom);
void SetLandscape(int isLandscape);
void SetFitMode(CairoFitMode mode);
void SetPDFSize(CairoSize type);
void SetPDFCairo(void *pCairo, bool state);
1 month ago
double GetInterpT(double z1, double z2, double target);
//ʸ<><CAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pdf<64><66><EFBFBD><EFBFBD> <20><>ȫʸ<C8AB><CAB8><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD>ǻ<EFBFBD>ʹ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ࣩܶ<DCB6><E0A3A9>δʹ<CEB4>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DrawMeshVector(CMesh& mesh);
void AddMarchingSquarePath(int i, int j, int step, double threshold, int caseIndex, CDimension3D* pDfg);
//ʸ<><CAB8>λͼ
void DrawMeshVectorImage(CMesh& mesh);
1 month ago
private:
void Clear();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
void SetCairoColorFromCOLORREF(cairo_t* cr, COLORREF color, double alpha = 1);
//<2F><><EFBFBD><EFBFBD>ӳ<EFBFBD>䵽A4
void Map_Coordinates(cairo_t* cr, double externalWidth, double externalHeight, double A4Width, double A4Height);
//<2F><><EFBFBD>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
double DegreesToRadians(double degrees);
uint8_t* LoadBMPToARGBData(const char* filePath, uint32_t& width, uint32_t& height);
//<2F><>ѯԪ<D1AF>ض<EFBFBD>Ӧ<EFBFBD><D3A6>COne
COne* FindElementMap(void* pValue);
//<2F><><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>
void DrawCairoText(CText& text, COLORREF color);
1 month ago
//<2F><><EFBFBD>ִ<EFBFBD><D6B4>нǶȴ<C7B6><C8B4><EFBFBD>
void DrawCairoTextAngle(CText &text, COLORREF color);
1 month ago
//<2F><><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>ʾ(Cairo<72><6F>֧<EFBFBD><D6A7>"\r\n" "\n")
void DrawCairoMultilineText(CText& text, COLORREF color);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫת90<39><30>
void DrawCairoVerticalText(CText& text, COLORREF color);
//<2F><><EFBFBD>γ<EFBFBD><CEB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DrawCairoFillRect(CRect8& rect, COLORREF color);
//<2F><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
void DrawCairoLine(std::vector<CAIROPOINT>& pointVec, COLORREF color = 0);
1 month ago
1 month ago
//ɫ<><C9AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DrawCairoRulerImage(CColorRuler& ruler, CColorBase &color);
1 month ago
void DrawCairoRulerImage_Reversal(CColorRuler& ruler, CColorBase& color);
1 month ago
//<2F><><EFBFBD><EFBFBD>ȱʡ<C8B1><CAA1><EFBFBD><EFBFBD>
void DrawOther(double x0, double y0, CSize8 sz, COLORREF col, UINT nMode, double a);
//<2F><><EFBFBD><EFBFBD>pdfҳ<66><D2B3>
void DrawCairoAddPdfNumber();
//
void DrawCairoCurveMark(CCurveEx &curve);
//<2F><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
void ComputeCurveName(CCurveEx &curve, CCurveName *pName, int state);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double DistancePolyLine(const CAIROPOINT& p1, const CAIROPOINT& p2);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double TotalLengthPolyLine(const std::vector<CAIROPOINT>& points);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPoint2D GetPolygonCentroid(const CCurveEx& curve, CXyDC* pXyDc);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַָ<D6B7><D6B8>ɵ<EFBFBD><C9B5><EFBFBD>
std::vector<std::string> StringSplit(const std::string& str);
/**
* <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);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD> <20><>ֵ
void DrawSmoothPathUsingInterpolation(
cairo_t* cr,
double* x,
double* y,
int count,
int samplesPerSegment = 20);
/**
* <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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* \param polysA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><EFBFBD><EFBFBD>
* \param curPoly <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void FillIntersection(
const std::vector<std::vector<CAIROPOINT>>& polysA,
std::vector<CAIROPOINT>& curPoly);
//<2F><><EFBFBD><EFBFBD>
void DrawCairoImageInsert(CImageInsert& image);
1 month ago
//ʸ<><CAB8>ͼλͼ
void DrawCairoImageInsert(CxImage& image, CRect8 rtReal);
1 month ago
private:
cairo_t* p_cairo;
cairo_surface_t* p_surface;
bool m_symbolstate; //<2F><><EFBFBD><EFBFBD>pdf<64><66><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><DFB6>߿<EFBFBD>ʹ<EFBFBD><CAB9>
double m_scale;
CSize8 m_paperSize; //ͼֽ<CDBC><D6BD><EFBFBD><EFBFBD>mm(A4)
CRect8 m_rect;
CSize8 m_unit;
CRect8 m_paperMargin; //<2F>߾ࣨ<DFBE><E0A3A8>λ<EFBFBD><CEBB> point<6E><74>72 point = 1Ӣ<31>
int m_landscape; //0<><30><EFBFBD><EFBFBD>Ӧ, 1Ϊ<31><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<><32><EFBFBD><EFBFBD>
int m_number; //ҳ<><D2B3>
CairoFitMode m_fitMode;
CString m_filePath;
std::unordered_map<void*, COne*> m_elementMap;
std::shared_ptr<CXyDC> m_cacheXyDC; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
std::shared_ptr<CXyDC> m_cacheOldXyDC; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
std::shared_ptr<CXyDC> m_symbolXyDC; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<std::vector<CAIROPOINT>> m_polygons; //<2F><>¼<EFBFBD><C2BC><EFBFBD>߸<EFBFBD><DFB8><EFBFBD>
};