📄 dxf_graph.cpp
字号:
#include "StdAfx.h"
#include "DXF_Graph.h"
int DXF_Graph::Init()/*初始化矢量图平量*/
{
m_RemoveY=0;
m_RemoveX=0;
return 0;
}
int DXF_Graph::SetDCObject(CDC *OUT_pDC)
{
IN_pDC=OUT_pDC;/*传递CDC指针到模块内部*/
return 0;
}
int DXF_Graph::SetWindowRange(CRect OUT_Rect)
{
IN_Rect=OUT_Rect; //传递图形显示区域到模块内部
m_consultx=(float)(IN_Rect.left+20);
m_consulty=(float)(IN_Rect.bottom-20);
return 0;
}
double DXF_Graph::GetGTrackRange(double MinX,double MaxX,double MinY,double MaxY)
{
//根据显示区域的大小取得适当的图形显示比例,并将该比例保存用于图形还原
double f1,f2;
f1=(IN_Rect.Width()-30)/(MaxX-MinX);
f2=(IN_Rect.Height()-30)/(MaxY-MinY);
if(f1<f2)
m_GScale=f1;
else m_GScale=f2;
m_OldScale=m_GScale;
m_xMove=m_consultx-MinX*m_GScale;
m_yMove=m_consulty-MinY*m_GScale;
return m_GScale;
}
int DXF_Graph::SetGTrackRange(double MinX,double MinY,double Scale)
{
//设置图形显示比例,并将该比例保存用于图形还原
m_GScale=Scale;
m_OldScale=Scale;
m_xMove=m_consultx-MinX*m_GScale;
m_yMove=m_consulty-MinY*m_GScale;
return 0;
}
int DXF_Graph::SetGrid(int GridX, int GridY)
{
Gx=GridX;
Gy=GridY;
int i,j;
CPen Pen_Grid(PS_DOT,1,RGB(0,150,0));
pOldPen=IN_pDC->SelectObject(&Pen_Grid);
for(i=1;IN_Rect.top+GridY*i<IN_Rect.bottom;i++)
{
IN_pDC->MoveTo(IN_Rect.left,IN_Rect.top+GridY*i);
IN_pDC->LineTo(IN_Rect.right,IN_Rect.top+GridY*i);
}
for(j=1;IN_Rect.left+GridX*j<IN_Rect.right;j++)
{
IN_pDC->MoveTo(IN_Rect.left+GridX*j,IN_Rect.top);
IN_pDC->LineTo(IN_Rect.left+GridX*j,IN_Rect.bottom);
}
IN_pDC->SelectObject(pOldPen);
return 0;
}
int DXF_Graph::SetAxisText(CString strX,CString strY)
{
IN_pDC->SetTextColor(RGB(255,255,255));
IN_pDC->TextOut(IN_Rect.left+65,IN_Rect.bottom-32,strX);
IN_pDC->TextOut(IN_Rect.left+20,IN_Rect.bottom-72,strY);
return 0;
}
int DXF_Graph::SetAxisColor(COLORREF Color)
{
Axis_Color=Color;
CPen Pen_Axis(PS_SOLID,1,Color);
pOldPen=IN_pDC->SelectObject(&Pen_Axis);
//画轴线
IN_pDC->MoveTo(IN_Rect.left+15, IN_Rect.bottom);
IN_pDC->LineTo(IN_Rect.left+15, IN_Rect.top);
IN_pDC->MoveTo(IN_Rect.left,IN_Rect.bottom-15);
IN_pDC->LineTo(IN_Rect.right,IN_Rect.bottom-15);
//画箭头
CPen ArrowPen(PS_SOLID,1,RGB(255,255,0));
IN_pDC->SelectObject(&ArrowPen);
IN_pDC->MoveTo(IN_Rect.left+15,IN_Rect.bottom-15);
IN_pDC->LineTo(IN_Rect.left+15,IN_Rect.bottom-55);
IN_pDC->LineTo(IN_Rect.left,IN_Rect.bottom-55);
IN_pDC->LineTo(IN_Rect.left+25,IN_Rect.bottom-89);
IN_pDC->LineTo(IN_Rect.left+50,IN_Rect.bottom-55);
IN_pDC->LineTo(IN_Rect.left+35,IN_Rect.bottom-55);
IN_pDC->LineTo(IN_Rect.left+35,IN_Rect.bottom-15);
IN_pDC->MoveTo(IN_Rect.left+15,IN_Rect.bottom-15);
IN_pDC->LineTo(IN_Rect.left+55,IN_Rect.bottom-15);
IN_pDC->LineTo(IN_Rect.left+55,IN_Rect.bottom);
IN_pDC->LineTo(IN_Rect.left+89,IN_Rect.bottom-25);
IN_pDC->LineTo(IN_Rect.left+55,IN_Rect.bottom-50);
IN_pDC->LineTo(IN_Rect.left+55,IN_Rect.bottom-35);
IN_pDC->LineTo(IN_Rect.left+15,IN_Rect.bottom-35);
IN_pDC->TextOut(IN_Rect.left+20,IN_Rect.bottom-32,"0");
IN_pDC->SelectObject(pOldPen);
return 0;
}
CPoint DXF_Graph::GetCoordinateOrigin()
{
/*取得x,y两轴线的交点,用于时间速度显示模块计算画图起点*/
Point.x=IN_Rect.left+15;
Point.y=IN_Rect.bottom-15;
m_TVLastX_1=Point.x;
m_TVLastY_1=Point.y;
m_TVLastX_2=Point.x;
m_TVLastY_2=Point.y;
m_TVLastX_3=Point.x;
m_TVLastY_3=Point.y;
return Point;
}
int DXF_Graph::SetBackColor(COLORREF Color)
{
Back_Color=Color;
IN_pDC->FillSolidRect(IN_Rect,Back_Color);
return 0;
}
float DXF_Graph::ChangeCoordinate(float X,int y)
{
float Changedx;
if(y==0)//对X坐标作坐标转换
{
Changedx=(float)((X+m_RemoveX)*m_GScale+m_xMove);
return Changedx;
}
if(y==1)//对Y坐标作坐标转换
{
Changedx=(float)(2*m_consulty-(X+m_RemoveY)*m_GScale-m_yMove);
return Changedx;
}
else return 99999;
}
int DXF_Graph::MoveToPoint(float XPos, float YPos)
{
CPen Pen_MtoP(PS_SOLID,1,RGB(255,255,255));
pOldPen=IN_pDC->SelectObject(&Pen_MtoP);
IN_pDC->MoveTo((int)((XPos+m_RemoveX)*m_GScale+m_xMove),(int)(2*m_consulty-(YPos+m_RemoveY)*m_GScale-m_yMove));
IN_pDC->SelectObject(pOldPen);
m_xpos=(float)((XPos+m_RemoveX)*m_GScale+m_xMove);/*保存该点信息,用于与下一点比较,进行截图处理*/
m_ypos=(float)(2*m_consulty-(YPos+m_RemoveY)*m_GScale-m_yMove);
return 0;
}
int DXF_Graph::LineToPoint(float XPos, float YPos,COLORREF Color)/*直接画线,不考虑越界。该函数主要用于时时采样电机位置画图*/
{
CPen Pen_LtoP(PS_SOLID,1,Color);
pOldPen=IN_pDC->SelectObject(&Pen_LtoP);
IN_pDC->LineTo((int)((XPos+m_RemoveX)*m_GScale+m_xMove),(int)(2*m_consulty-(YPos+m_RemoveY)*m_GScale-m_yMove));
IN_pDC->SelectObject(pOldPen);
return 0;
}
int DXF_Graph::LineToPoint(float XPos, float YPos,COLORREF Color,DWORD CurType)//画线,考虑越界。
{
float itemX,itemY,x,y;
CPen Pen_LtoP(PS_SOLID,1,Color);
pOldPen=IN_pDC->SelectObject(&Pen_LtoP);
x=ChangeCoordinate(XPos,0);
y=ChangeCoordinate(YPos,1);
if((x>=(float)IN_Rect.left && x<=(float)IN_Rect.right) && //当前点在显示区域内部
(y<=(float)IN_Rect.bottom && y>=(float)IN_Rect.top))
{
if(CurType==0x00030001)//当前点为直线,分为2种情况:1:上一点在显示区域外部,2:上一点在显示区域内部
{
/*上一点在显示区域外部*/
if(((float)IN_Rect.top>=m_ypos && (float)IN_Rect.top<=y) &&
(m_xpos>=((float)IN_Rect.left-(x-(float)IN_Rect.left)*((float)IN_Rect.top-m_ypos)/(y-(float)IN_Rect.top)) &&
m_xpos<=((float)IN_Rect.right-(x-(float)IN_Rect.right)*((float)IN_Rect.top-m_ypos)/(y-(float)IN_Rect.top))))
{
itemX=(float)IN_Rect.top*(m_xpos-x)/(m_ypos-y)+(x*m_ypos-y*m_xpos)/(m_ypos-y);
itemY=(float)IN_Rect.top;
IN_pDC->MoveTo((int)itemX,(int)itemY);
IN_pDC->LineTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
/*上一点在显示区域外部*/
if(((float)IN_Rect.bottom>=y && (float)IN_Rect.bottom<=m_ypos) &&
(m_xpos>=((float)IN_Rect.left-(x-(float)IN_Rect.left)*((float)IN_Rect.bottom-m_ypos)/(y-(float)IN_Rect.bottom)) &&
m_xpos<=((float)IN_Rect.right-(x-(float)IN_Rect.right)*((float)IN_Rect.bottom-m_ypos)/(y-(float)IN_Rect.bottom))))
{
itemX=(float)IN_Rect.bottom*(m_xpos-x)/(m_ypos-y)+(x*m_ypos-y*m_xpos)/(m_ypos-y);
itemY=(float)IN_Rect.bottom;
IN_pDC->MoveTo((int)itemX,(int)itemY);
IN_pDC->LineTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
/*上一点在显示区域外部*/
if(((float)IN_Rect.right>=x && (float)IN_Rect.right<=m_xpos) &&
(m_ypos>=((float)IN_Rect.top-(y-(float)IN_Rect.top)*((float)IN_Rect.right-m_xpos)/(x-(float)IN_Rect.right)) &&
m_ypos<=((float)IN_Rect.bottom-(y-(float)IN_Rect.bottom)*((float)IN_Rect.right-m_xpos)/(x-(float)IN_Rect.right))))
{
itemX=(float)IN_Rect.right;
itemY=(float)IN_Rect.right*(m_ypos-y)/(m_xpos-x)+(y*m_xpos-x*m_ypos)/(m_xpos-x);
IN_pDC->MoveTo((int)itemX,(int)itemY);
IN_pDC->LineTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
/*上一点在显示区域外部*/
if(((float)IN_Rect.left>=m_xpos && (float)IN_Rect.left<=x) &&
(m_ypos>=((float)IN_Rect.top-(y-(float)IN_Rect.top)*((float)IN_Rect.left-m_xpos)/(x-(float)IN_Rect.left)) &&
m_ypos<=((float)IN_Rect.bottom-(y-(float)IN_Rect.bottom)*((float)IN_Rect.left-m_xpos)/(x-(float)IN_Rect.left))))
{
itemX=(float)IN_Rect.left;
itemY=(float)IN_Rect.left*(m_ypos-y)/(m_xpos-x)+(y*m_xpos-x*m_ypos)/(m_xpos-x);
IN_pDC->MoveTo((int)itemX,(int)itemY);
IN_pDC->LineTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
/*上一点在显示区域内部*/
else
{
IN_pDC->LineTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
}
else//当前数据单元不是直线单元且当前点在显示区域内部
{
IN_pDC->LineTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
}
else//当前点在显示区域外部
{
if(CurType==0x00030001)
{
if((m_xpos>=(float)IN_Rect.left && m_xpos<=(float)IN_Rect.right) &&
(m_ypos<=(float)IN_Rect.bottom && m_ypos>=(float)IN_Rect.top))
{
if(((float)IN_Rect.left>=x && (float)IN_Rect.left<=m_xpos) &&
(y>=((float)IN_Rect.top-(m_ypos-(float)IN_Rect.top)*((float)IN_Rect.left-x)/(m_xpos-(float)IN_Rect.left)) &&
y<=((float)IN_Rect.bottom-(m_ypos-(float)IN_Rect.bottom)*((float)IN_Rect.left-x)/(m_xpos-(float)IN_Rect.left))))
{
itemX=(float)IN_Rect.left;
itemY=(float)IN_Rect.left*(m_ypos-y)/(m_xpos-x)+(y*m_xpos-x*m_ypos)/(m_xpos-x);
IN_pDC->LineTo((int)itemX,(int)itemY);
IN_pDC->MoveTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
if(((float)IN_Rect.right>=m_xpos && (float)IN_Rect.right<=x) &&
(y>=((float)IN_Rect.top-(m_ypos-(float)IN_Rect.top)*((float)IN_Rect.right-x)/(m_xpos-(float)IN_Rect.right)) &&
y<=((float)IN_Rect.bottom-(m_ypos-(float)IN_Rect.bottom)*((float)IN_Rect.right-x)/(m_xpos-(float)IN_Rect.right))))
{
itemX=(float)IN_Rect.right;
itemY=(float)IN_Rect.right*(m_ypos-y)/(m_xpos-x)+(y*m_xpos-x*m_ypos)/(m_xpos-x);
IN_pDC->LineTo((int)itemX,(int)itemY);
IN_pDC->MoveTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
if(((float)IN_Rect.top>=y && (float)IN_Rect.top<=m_ypos) &&
(x>=((float)IN_Rect.left-(m_xpos-(float)IN_Rect.left)*((float)IN_Rect.top-y)/(m_ypos-(float)IN_Rect.top)) &&
x<=((float)IN_Rect.right-(m_xpos-(float)IN_Rect.right)*((float)IN_Rect.top-y)/(y-(float)IN_Rect.top))))
{
itemX=(float)IN_Rect.top*(m_xpos-x)/(m_ypos-y)+(x*m_ypos-y*m_xpos)/(m_ypos-y);
itemY=(float)IN_Rect.top;
IN_pDC->LineTo((int)itemX,(int)itemY);
IN_pDC->MoveTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
if(((float)IN_Rect.bottom>=m_ypos && (float)IN_Rect.bottom<=y) &&
(x>=((float)IN_Rect.left-(m_xpos-(float)IN_Rect.left)*((float)IN_Rect.bottom-y)/(m_ypos-(float)IN_Rect.bottom)) &&
x<=((float)IN_Rect.right-(m_xpos-(float)IN_Rect.right)*((float)IN_Rect.bottom-y)/(m_ypos-(float)IN_Rect.bottom))))
{
itemX=(float)IN_Rect.bottom*(m_xpos-x)/(m_ypos-y)+(x*m_ypos-y*m_xpos)/(m_ypos-y);
itemY=(float)IN_Rect.bottom;
IN_pDC->LineTo((int)itemX,(int)itemY);
IN_pDC->MoveTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
}
else//先前点不在显示区域内
{
/*IN_pDC->MoveTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;*/
}
}
else//not line
{
IN_pDC->MoveTo((int)x,(int)y);
m_xpos=x;
m_ypos=y;
}
}
return 0;
}
int DXF_Graph::ReMove(CString dirIndex)
{
if(dirIndex=="MG_RIGHT")
{
m_RemoveX+=10;
}
if(dirIndex=="MG_LEFT")
{
m_RemoveX-=10;
}
if(dirIndex=="MG_UP")
{
m_RemoveY+=10;
}
if(dirIndex=="MG_DOWN")
{
m_RemoveY-=10;
}
return 0;
}
int DXF_Graph::ChangeTOBack()
{
m_RemoveY=0;
m_RemoveX=0;
m_GScale=m_OldScale;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -