#pragma once
#include "afx.h"
#include "2DCommon.h"

/* DLL用
#if !defined (_WIN32)
#   define EXPORT __export
#   define EXPORT32
#else
#   define EXPORT
#   if defined DLL
#      define EXPORT32 __declspec(dllexport)
#   else
#      define EXPORT32 __declspec(dllimport)
#   endif
#endif*/

/************************************************************************
// [9/29/2010,21:08 chenym] 类框架图
CObject
   |
   |--C2DObject                                (画图基类)
   |    |     |
   |	|     |--C2DAtom                       (原子类)
   |	|	           |
   |	|			   |--C2DPoint             (点类)
   |	|			   |
   |	|			   |--C2DLine
   |	|              |        |
   |	|              |        |--C2DBeeLine  (直线类)
   |	|              |        |
   |	|              |        |--C2DPolyLine (折线类)
   |	|              |        |
   |	|              |        |--C2DTriangle (三角形类)
   |	|              |        |
   |	|              |        |--C2DCircle   (空心圆类)
   |    |              |
   |    |              |--C2DPolygon (期待中……)
   |	|
   |	|--------C2DMap                        (图幅类)
   |
   |
   |--C2DGlobal                                (全局对象类)

************************************************************************/


/************************************************************************
 全局对象类
************************************************************************/
class C2DGlobal:
	public CObject
{
public:
	C2DGlobal();
	virtual ~C2DGlobal();

	virtual void Serialize(CFile* pFile, BOOL bSave = TRUE);
public:
	BYTE     m_byLineStyle[5];           // 线型，0直线、1折线、2曲线、3三角形、4空心圆
	UINT     m_wLineWidth[5];            // 线宽，0直线、1折线、2曲线、3三角形、4空心圆
	BYTE     m_byR[6];                   // 颜色R，0直线、1折线、2曲线、3三角形、4空心圆、5点
	BYTE     m_byG[6];                   // 颜色G，0直线、1折线、2曲线、3三角形、4空心圆、5点
	BYTE     m_byB[6];                   // 颜色B，0直线、1折线、2曲线、3三角形、4空心圆、5点
	UINT     m_CurveType;
	BOOL     m_bHide;
};

/************************************************************************
 全局对象
************************************************************************/
extern C2DGlobal g_2DObj;

/************************************************************************
 二维画图基类
************************************************************************/
class C2DObject :
	public CObject
{
public:
	C2DObject(void);
	virtual ~C2DObject(void);
	virtual void Serialize(CFile* pFile, BOOL bSave = TRUE)=0;
	virtual UINT GetClass(){return 0;};
	virtual void Draw(CDC* pDC)=0;
	static C2DObject* CreateObject(enum enumDrawClass enumClassType);
	DWORD GetID();
	void  SetID(DWORD dwID);
protected:
	DWORD  m_dwID;                    // 对象唯一标识
	
};

/************************************************************************
 二维图元原子类
************************************************************************/
class C2DAtom:
	public C2DObject
{
public:
	C2DAtom();
	virtual ~C2DAtom();

	virtual void Serialize(CFile* pFile, BOOL bSave = TRUE);
	virtual UINT GetClass();
	COLORREF GetColor();
	void     GetColor(BYTE& r, BYTE& g, BYTE& b);
	virtual void SetColor(const COLORREF& clr);
	virtual void SetColor(const BYTE& r, const BYTE& g, const BYTE& b);
protected:
	BYTE     m_byR;
	BYTE     m_byG;
	BYTE     m_byB;
};

/************************************************************************
二维点类 
************************************************************************/
class C2DPoint:
	public C2DAtom
{
public:
	C2DPoint();
	C2DPoint(CPoint& pt);
	virtual ~C2DPoint();

	virtual void Serialize(CFile* pFile, BOOL bSave  = TRUE);
	virtual void Draw(CDC* pDC);
	virtual UINT GetClass();
	void GetPoint(int& x,int& y);
protected:
	//float    m_fRadius;
	CPoint   m_Position;
};

/************************************************************************
 二维线类
************************************************************************/
class C2DLine:
	public C2DAtom
{
public:
	C2DLine();
	virtual ~C2DLine();

	virtual void Serialize(CFile* pFile, BOOL bSave  = TRUE);

	BYTE m_byLineStyle;           // 线型
	UINT m_wLineWidth;            // 线宽
};

/************************************************************************
 二维直线类
************************************************************************/
class C2DBeeLine:
	public C2DLine
{
public:
	C2DBeeLine();
	C2DBeeLine(CPoint& ptS, CPoint& ptE);
	virtual ~C2DBeeLine();

	virtual void Serialize(CFile* pFile, BOOL bSave  = TRUE);
	virtual void Draw(CDC* pDC);
	virtual UINT GetClass();
	void GetPoint(int& x1,int& y1,int& x2,int& y2);
protected:
	CPoint   m_ptStart;
	CPoint   m_ptEnd;
};

/************************************************************************
 二维折线类
************************************************************************/
class C2DPolyLine:
	public C2DLine
{
public:
	C2DPolyLine();
	C2DPolyLine(CArray<CPoint, CPoint&>& arPt);
	virtual ~C2DPolyLine();

	virtual void Serialize(CFile* pFile, BOOL bSave  = TRUE);
	virtual void Draw(CDC* pDC);
	virtual UINT GetClass();
	void GetPoint(int nIndex,int& x,int& y);
	DWORD GetCount();
protected:
	CArray<CPoint, CPoint&>  m_arPt;
};

/************************************************************************
 二维曲线类
************************************************************************/
class C2DCurve:
	public C2DLine
{
public:
	C2DCurve();
	C2DCurve(CArray<CPoint, CPoint&>& arPt, enum enumCurveType type);
	virtual ~C2DCurve();

	virtual void Serialize(CFile* pFile, BOOL bSave  = TRUE);
	virtual void Draw(CDC* pDC);
	virtual UINT GetClass();
	void GetPoint(int nIndex,int& x,int& y);
	DWORD GetCount();
protected:
	CArray<CPoint, CPoint&>  m_arPt;
	enumCurveType m_CurveType;
};

/************************************************************************
二维三角形类                                                                     
************************************************************************/
class C2DTriangle:
	public C2DLine
{
public:
	C2DTriangle();
	C2DTriangle(CArray<CPoint, CPoint&>& arPt);
	virtual ~C2DTriangle();

	virtual void Serialize(CFile* pFile, BOOL bSave  = TRUE);
	virtual void Draw(CDC* pDC);
	virtual UINT GetClass();
	void GetPoint(int nIndex,int& x,int& y);
protected:
	CArray<CPoint, CPoint&>  m_arPt;
};

/************************************************************************
二维空心圆类                                                                    
************************************************************************/
class C2DCircle:
	public C2DLine
{
public:
	C2DCircle();
	C2DCircle(CPoint& ptl, CPoint& ptr);
	virtual ~C2DCircle();

	virtual void Serialize(CFile* pFile, BOOL bSave  = TRUE);
	virtual void Draw(CDC* pDC);
	virtual UINT GetClass();
	void GetPoint(int& x1,int& y1,int& x2,int& y2);
protected:
	CPoint  m_ptl;
	CPoint  m_ptr;
};

/************************************************************************
 二维图幅类
************************************************************************/
class C2DMap:
	public C2DObject
{
public:
	C2DMap();
	virtual ~C2DMap();
    
	virtual void Serialize(CFile* pFile, BOOL bSave  = TRUE );
	int AddObject(C2DObject* pObj);
    virtual void Draw(CDC* pDC);
	BOOL Save(CString szFilePath);
	void Open(CString szFilePath);
	DWORD GetCount();
public:
	CArray<C2DObject*,C2DObject*> m_arObj;
};
