////////////////////////////////////////////////////////////////////////////// //文件 PathXy.h //主要功能: // 为了路径填充等 // //程序编写: 2005-12-07 /* gaofeng 20250508 关于pcg格式修改说明 pcg2 中组合图元分为三种, ,: 主要应用为符号图元,或将图元组成符号时使用 主要是指嵌入的剖面,单井图元。 主要是图元的组合使用。 当前CXyBlock 是类型的组合图元, 不要认为其是符号图元 gaofeng 20250630 对于DFD格式文件: ver2025版本可以读取 group图元的锚点等属性,但是保存时由于是ver2022版本,所以这样属性数据会消失. */ ///////////////////////////////////////////////////////////////////////////// #pragma once #include "..\projectionLib\projection.h" #include "KXmlParse.h" class AFX_EXT_CLASS CXyBlock : public CBaseObject { public: CXyBlock(void); CXyBlock(LPCTSTR lpszBlockTitle, int nEndType); virtual ~CXyBlock(void); int GetId() const; void SetId(int64_t id); virtual void Clear(); virtual void Draw(void* pXyDC); virtual int Read(CFile& fr, const short& ver); virtual int ReadDML(CFile &fr, const short &ver); virtual int ReadPCG(CFile &fr, const short &ver); /** @brief 处理组合块符号没有加载到当前符号 */ virtual int ReadPCGEx(CFile &fr, const short &ver, void *pXy = nullptr); virtual void GetRange(CRect8& range); virtual void GetRange(CPoint3D& minPoint, CPoint3D& maxPoint); virtual BOOL IsInRange(CRect8& range); virtual void Calibrate(int type, void* pValue); virtual void Serialize(CArchive& ar, const short& ver) override; void Write(CFile &fw, const short& ver); void WriteDML(CFile &fw, const short& ver, int nBaseTabNum); void WritePCG(CFile &fw, const short& ver, int nBaseTabNum); virtual void WriteSummary(CFile &fw, const short& ver, int nBaseTabNum); virtual int ReadSummary(CFile &fr, const short &ver); void operator=(CXyBlock& pn); void Offset(double dx, double dy); void ScaleCoor(double xs, double ys, double dx, double dy); void ScaleProperty(double sx, double sy); void Rotate(double xs, double ys, double angle); void ScaleCoordinate(double sx, double sy, int mode); //mode=0:加,1:减,2:乘,3:除 void ExchangeXY(void); //交换XY坐标 void ExchangeXY(CProjection* pxyz); //转换到指定投影坐标 virtual void SetXy(void* pPathXy); void* GetXy() { return m_pXy; } int Dissolution(void* pxy, CPositionList& addList, POSITION posSource); void SetTitle(LPCTSTR lpszBlockTitle) { m_strBlockTitle = lpszBlockTitle; } CString GetBlockTitle() { return m_strBlockTitle; } CString GetBeginBlockTitle(int ver=2022); CString GetEndBlockTitle(); LPCTSTR GetName(); void SetName(LPCTSTR lpszBlockName); DWORD m_dwFlags; //扩展风格 void SetEnbaleWriteCallOut(BOOL b) { m_bWriteCallOut = b; }; //ggff2025 protected: void* m_pXy; //CXy对象 //插入块类型的标题 CString m_strBlockTitle; int m_eleEndType; //元素类型,用于DFB格式 int64_t m_id ; BOOL m_bWriteCallOut; //是否写边框(PCG格式使用)ggff2025 protected: virtual void WritePCG_Callout(CFile& fw, int nBaseTabNum); //ggff2025 public: virtual int ReadPCGEx(CKXmlParse& xp, const short &ver, void *pXy = nullptr); virtual int ReadPCG(CKXmlParse& xp, const short &ver); public: CRect8 m_rect; //框的矩形范围 CRect8 m_rtMargin; //外框和内部图的边距 CPoint2D m_ptAnchor; //锚点 double m_dPercent; //锚宽度比例,默认为1/4 protected: CCurveEx m_curve; //边框线 DWORD m_dwAnchorFlags;//锚点风格 double m_dAnchorWidth; //锚宽度 public: CCurveEx* GetCurve() { return &m_curve; } //计算外框范围 void ComputeRect(); //开关变量值 virtual void SetHide(BOOL bFlag); virtual void SetFrameAnchor(BOOL bFlag); virtual void SetAnchorFit(BOOL bFlag); virtual void SetFrameLineType(DWORD type); virtual void RemoveFrameLineType(DWORD type); virtual void SetFrameType(DWORD type); virtual void SetAlignH(DWORD type); virtual void SetAlignV(DWORD type); virtual void SetPathFillType(DWORD type); virtual BOOL IsShowFrame(); virtual BOOL IsHide(); virtual BOOL IsFrameAnchor(); virtual BOOL IsAnchorFit(); virtual BOOL IsFrameLineL(); virtual BOOL IsFrameLineR(); virtual BOOL IsFrameLineT(); virtual BOOL IsFrameLineB(); virtual BOOL IsFrameLineIcU(); virtual BOOL IsFrameLineIcD(); virtual BOOL IsFrameRect(); virtual BOOL IsFrameCircle(); virtual BOOL IsFrameEllipse(); virtual BOOL IsAlignLeft(); virtual BOOL IsAlignRight(); virtual BOOL IsAlignCenterH(); virtual BOOL IsAlignTop(); virtual BOOL IsAlignBottom(); virtual BOOL IsAlignCenterV(); virtual BOOL IsFillStyleAlternate(); virtual BOOL IsFillStyleWinding(); //virtual void Calibrate(int type, void* pValue); virtual void SetRange(CRect8& range); int GetAnchorEdgeIndex(CPoint2D point); void CreateCurve(); void CreateRectCurve(); void CreateEllipseCurve(double dRadiusX, double dRadiusY); void Transform(CXyDC* pDC, float* matrix, BOOL bUndo); //根据偏移矩阵修改参数 virtual void Draw(CXyDC& dc, void* pHowToView); void SetXy(void* pPathXy, BOOL bClear); enum enumGroupStyleFlags { GroupHide = 0x00000001, //隐藏 GroupFrameLineL = 0x00000002, //画左边框线 GroupFrameLineR = 0x00000004, //画右边框线 GroupFrameLineT = 0x00000008, //画上边框线 GroupFrameLineB = 0x00000010, //画下边框线 GroupFrameLineStraAll = (GroupFrameLineL | GroupFrameLineR | GroupFrameLineT | GroupFrameLineB), GroupFrameLineIcU = 0x00000020, //画斜上边框线 GroupFrameLineIcD = 0x00000040, //画斜下边框线 GroupFrameLineIcAll = (GroupFrameLineIcU | GroupFrameLineIcD), GroupFrameLineAll = (GroupFrameLineStraAll | GroupFrameLineIcAll), GroupFrameAnchor = 0x00000100, //边框使用锚点 GroupFrameRect = 0x00000200, //边框矩形 GroupFrameRoundRect = 0x00000400, //边框圆角矩形 GroupFrameEllipse = 0x00000800, //边框椭圆 GroupFrameAll = (GroupFrameRect | GroupFrameRoundRect | GroupFrameEllipse), //水平对齐方式 GroupAlignLeft = 0x00001000, //居左 GroupAlignCenterH = 0x00002000, //水平居中 GroupAlignRight = 0x00004000, //居右(缺省) GroupAlignAllH = (GroupAlignLeft | GroupAlignCenterH | GroupAlignRight), //垂直对齐方式 GroupAlignTop = 0x00008000, //居上 GroupAlignCenterV = 0x00010000, //垂直居中 GroupAlignBottom = 0x00020000, //居下(缺省) GroupAlignAllV = (GroupAlignTop | GroupAlignCenterV | GroupAlignBottom), PathFillAlternate = 0x00100000, //奇数充填,偶数不充填方式 PathFillWinding = 0x00200000, //不管是奇数还是偶数均充填 PathFillAll = (PathFillAlternate | PathFillWinding) }; enum enumAnchorStyleFlags { AnchorFit = 0x00000001, //固定 }; }; //插入块类型 typedef CXyBlock CInsertBlock; class AFX_EXT_CLASS CPathFill : public CXyBlock { public: CPathFill(void); virtual ~CPathFill(void); virtual void Draw(void* pXyDC); void operator=(CPathFill& pn); enum enumStyleFlags { styleAlternate =0x00000001, //奇数充填,偶数不充填方式 styleWinding =0x00000002, //不管是奇数还是偶数均充填 styleAll =(styleAlternate|styleWinding) }; };