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.

229 lines
6.8 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.

//////////////////////////////////////////////////////////////////////////////
//文件 PathXy.h
//主要功能:
// 为了路径填充等
//
//程序编写: 2005-12-07
/* gaofeng 20250508 关于pcg格式修改说明
pcg2 中组合图元分为三种<block>,<EmbedPcg> ,<Group>:
<block>主要应用为符号图元,或将图元组成符号时使用
<EmbedPcg> 主要是指嵌入的剖面,单井图元。
<Group> 主要是图元的组合使用。
当前CXyBlock 是<Group>类型的组合图元, 不要认为其是<block>符号图元
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)
};
};