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.

366 lines
7.0 KiB
C

#pragma once
//ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
using namespace std;/*ʹ<>ñ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֿռ<D6BF>*/
//STL <20><>׼ͷ<D7BC>ļ<EFBFBD>
#include <set>
#include <vector>
#include <list>
#include <iostream>
#include <fstream>
#include <string>
#include <utility>
#include <map>
#include <deque>
#include <algorithm>
//<2F><><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EBBEAF>
#pragma warning(disable : 4800)
#pragma warning(disable : 4244)
#pragma warning(disable : 4996)
#pragma warning(disable : 4018)
#define PI 3.14159265358979323846
//#define COORD_EPS 0.001 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBEAB>(0.001 <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>С<EFBFBD><D0A1>1um <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
#define COORD_EPS 0.00001
#define RGB_WHITE RGB(255,255,255) //<2F><>ɫ
#define RGB_BLACK RGB(0,0,0) //<2F><>ɫ
#define RGB_GREEN RGB(0,255,0) //<2F><>ɫ
#define RGB_GREEN1 RGB(29,241,135) //<2F><>ɫ
#define RGB_RED RGB(255,0,0) //<2F><>ɫ
#define RGB_PINK RGB(255,55,120) //<2F>ۺ<EFBFBD>ɫ
#define RGB_PINK1 RGB(231,61,175) //<2F>ۺ<EFBFBD>ɫ
#define RGB_YELLOW RGB(255,255,0) //<2F><>ɫ
#define RGB_BLUE RGB(0,0,255) //<2F><>ɫ
#define RGB_BLUE1 RGB(153,217,234) //<2F><><EFBFBD><EFBFBD>ɫ
#define RGB_NODE_BLUE RGB(0,63,255) //<2F>ڵ<EFBFBD><DAB5><EFBFBD>ɫ
#define RGB_PURPLE RGB(163,73,164) //<2F><>ɫ
#define RGB_GRAY RGB(240,240,240) //<2F><>ɫ
#define RGB_GRAY1 RGB(160,160,160) //<2F><>ɫ
#define STR_NULL ""
#define STR_INPUT_ERROR "<22><>Чָ<D0A7><D6B8>: "
#define STR_INPUT_SYMBOL '>'
//<2F><><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>
enum MOUSE_TOOL
{
_TOOL_POINT=0,
_TOOL_RECT,
_TOOL_LINE,
_TOOL_PLINE,//<2F><><EFBFBD>߶<EFBFBD>
_TOOL_CIRCLE,
_TOOL_MOVE,
_TOOL_MOVE2,//ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
_TOOL_ROTATO,
_TOOL_COPY,
_TOOL_MEASURE,//<2F><><EFBFBD><EFBFBD>
_TOOL_ZOOM,//<2F><><EFBFBD><EFBFBD>
_TOOL_CUT,//<2F>޼<EFBFBD>
_TOOL_ADD_NODE,//<2F><><EFBFBD>ӽڵ<D3BD>
_TOOL_DEL_NODE,//ɾ<><C9BE><EFBFBD>ڵ<EFBFBD>
_TOOL_BREAK_NODE,//<2F><><EFBFBD>Ͻڵ<CFBD>
_TOOL_MOVE_NODE,//<2F>ƶ<EFBFBD><C6B6>ڵ<EFBFBD>
_TOOL_TEXT,//<2F><><EFBFBD><EFBFBD>
_TOOL_BARCODE,//<2F><><EFBFBD><EFBFBD>
_TOOL_ONE_POINT,//һ<><D2BB><EFBFBD><EFBFBD>
_TOOL_STRETCH,//<2F><><EFBFBD><EFBFBD><ECB9A4>
_TOOL_PT_MOVE_TO_CCD,//<2F><><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>;<EFBFBD>ĵ<EFBFBD>
_TOOL_SET_MARK_PT,//<2F>ֶ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
};
enum OBJ_TYPE
{
_TYPE_BASE = 0,
_TYPE_PLINE,//<2F><><EFBFBD>߶<EFBFBD>1
_TYPE_POINT,//<2F><>2
_TYPE_CIRCLE,//Բ3
_TYPE_COMPOSITE,//һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4
_TYPE_TXT,//<2F>ַ<EFBFBD><D6B7><EFBFBD>5
_TYPE_BARCODE,//<2F><><EFBFBD><EFBFBD>6
_TYPE_STR,//string 7
_TYPE_CHAR,//<2F>ַ<EFBFBD>8
};
enum X_OR_Y
{
_X=0,
_Y,
_XY,
};
enum CATCH_PT_TYPE//ץȡ<D7A5><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
_CATCH_NODE = 0,//<2F><><EFBFBD><EFBFBD>
_CATCH_INTERSECT,//<2F>߶εĽ<CEB5><C4BD><EFBFBD>
_CATCH_ORTHO,//<2F><><EFBFBD><EFBFBD>
_CATCH_CUT_TRACK,//Ԫ<><D4AA><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
enum STATUS//<2F><><EFBFBD><EFBFBD>ߵ<EFBFBD>״ֵ̬,<2C><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD>ʲô<CAB2><C3B4><EFBFBD><EFBFBD>
{
_STATUS_1 = 0,
_STATUS_2,
_STATUS_3,
_STATUS_4,
_STATUS_5,
_STATUS_6,
_STATUS_END
};
enum OBJ_OP_TYPR
{
_OP_MOVE = 0,
_OP_ROTATO,
_OP_MIRROR,
_OP_STRETCH,//<2F><><EFBFBD><EFBFBD>
_OP_REVERSE,//<2F><>ת<EFBFBD><D7AA><EFBFBD>ݵ<EFBFBD>
_OP_SCALE,//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
inline bool IsDbEqual(double a,double b)
{
if((abs(a-b))<COORD_EPS)
return true;
else
return false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>xy <20><><EFBFBD><EFBFBD>,<2C><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
class Dbxy
{
friend bool operator==(const Dbxy &lhs, const Dbxy &rhs);
public:
Dbxy(double _x,double _y):x(_x),y(_y){};
Dbxy()
{
x= y =0;
};
bool Equal(Dbxy &pt)
{
if(IsDbEqual(x,pt.x) && IsDbEqual(y,pt.y))
return true;
else
return false;
}
public:
double x;
double y;
};
inline bool operator==(const Dbxy &lhs, const Dbxy &rhs)
{
return (IsDbEqual(lhs.x,rhs.x) && IsDbEqual(lhs.y,rhs.y));
}
//ץȡ<D7A5><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class CCatchPoint :public Dbxy
{
public:
CCatchPoint(double _x,double _y,CATCH_PT_TYPE type):Dbxy(_x,_y),m_type(type){};
CCatchPoint()
{
Dbxy::Dbxy();
};
CATCH_PT_TYPE GetType(){return m_type;};
public:
CATCH_PT_TYPE m_type;
};
class DbSize
{
public:
DbSize(double _w,double _h):w(_w),h(_h){};
DbSize()
{
w= h =0;
};
public:
double w;
double h;
};
class IntXY
{
friend bool operator==(const IntXY &lhs, const IntXY &rhs);
public:
IntXY(int _x,int _y):x(_x),y(_y){};
IntXY()
{
x = y =0;
};
public:
int x;
int y;
};
inline bool operator==(const IntXY &lhs, const IntXY &rhs)
{
return (lhs.x == rhs.x && lhs.y == rhs.y);
}
#if 1
class DbRect
{
public:
DbRect(double _L,double _R,double _T,double _B):L(_L),R(_R),T(_T),B(_B){};
DbRect(Dbxy pt1,Dbxy pt2){Creat(pt1,pt2);}
DbRect(Dbxy pt,double size){Creat(pt,size);}//size <20><>rect <20>İ뾶
DbRect(Dbxy pt,DbSize size)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ͳߴ<CDB3><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
Creat(pt,size);
};
DbRect(){Reset();};
void Creat(Dbxy pt1,Dbxy pt2);
void Creat(Dbxy pt,double size);
void Creat(Dbxy pt,DbSize size);
void Reset();
bool IsZero();
DbSize GetSize();
Dbxy GetCenterPt();
Dbxy GetBottomCenterPt();
double Width();
double Height();
public:
double L;
double R;
double T;
double B;
};
inline void DbRect::Reset()
{
L= B = 0.1;
R = T = 0;
}
inline void DbRect::Creat(Dbxy pt1,Dbxy pt2)
{
if(pt1.x < pt2.x)
{
L = pt1.x;
R = pt2.x;
}
else
{
L = pt2.x;
R = pt1.x;
}
if(pt2.y<pt1.y)
{
T = pt1.y;
B = pt2.y;
}
else
{
T = pt2.y;
B = pt1.y;
}
}
inline void DbRect::Creat(Dbxy pt,double size)
{
L = pt.x-size;
R = pt.x+size;
T = pt.y+size;
B = pt.y-size;
}
inline void DbRect::Creat(Dbxy pt,DbSize size)
{
L = pt.x-size.w/2;
R = pt.x+size.w/2;
T = pt.y+size.h/2;
B = pt.y-size.h/2;
}
inline bool DbRect::IsZero()
{
if(L<R || B<T)
return false;
else
return true;
}
inline Dbxy DbRect::GetCenterPt()
{
Dbxy pt;
if(L<=R)
{
pt.x = (L+R)/2;
}
if(T>=B)
{
pt.y = (T+B)/2;
}
return pt;
}
inline DbSize DbRect::GetSize()
{
DbSize size;
size.w = R - L;
size.h = T - B;
if(size.w<0)
size.w = 0;
if(size.h<0)
size.h = 0;
return size;
}
//<2F>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD>ĵ<EFBFBD>
inline Dbxy DbRect::GetBottomCenterPt()
{
Dbxy pt;
pt.x = (L+R)/2;
pt.y = B;
return pt;
}
inline double DbRect::Width()
{
return R-L;
}
inline double DbRect::Height()
{
return T-B;
}
#endif
//<2F><>װ<EFBFBD><D7B0><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>,<2C><><EFBFBD><EFBFBD>ͳһ<CDB3><D2BB><EFBFBD>͸<EFBFBD>ʽ
struct SObjOperatePar{
SObjOperatePar()
{
MoveX = MoveY = 0;
Angle = 0;
OldSize = NewSize = Diff = 0;
Scale = 1;
}
OBJ_OP_TYPR OpType;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
X_OR_Y xy;//<2F><>ʶxy <20><><EFBFBD><EFBFBD>
Dbxy BasePt;//<2F><>׼<EFBFBD><D7BC>
double MoveX;//<2F>ƶ<EFBFBD><C6B6><EFBFBD>
double MoveY;
double Angle;//360 <20>Ƚ<EFBFBD>
double OldSize;
double NewSize;
double Diff;
double Scale;//<2F><><EFBFBD>ű<EFBFBD><C5B1><EFBFBD>
};
typedef pair<CPoint,bool> PointType;
//<2F><><EFBFBD><EFBFBD>Բ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
class CCirclePar
{
public:
CCirclePar(void)
{
Radius = 1;
DEdgeCnt = 32;
bMerge = true;
StartAng = 0;
EndAng = 360;
}
public:
Dbxy CenterPt;//Բ<><D4B2>
double Radius;//<2F>
int DEdgeCnt;//<2F><><EFBFBD><EFBFBD>
bool bMerge;//<2F>Ƿ<EFBFBD><C7B7>ϲ<EFBFBD>
double StartAng;//<2F><>ʼ<EFBFBD>Ƕ<EFBFBD>360 <20>Ƚ<EFBFBD>
double EndAng;//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD>
};