www.pudn.com > DrawVector.rar > DrawDoc.cpp
// DrawDoc.cpp : implementation of the CDrawDoc class
//
#include "stdafx.h"
#include "Draw.h"
#include "DrawDoc.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc
IMPLEMENT_DYNCREATE(CDrawDoc, CDocument)
BEGIN_MESSAGE_MAP(CDrawDoc, CDocument)
//{{AFX_MSG_MAP(CDrawDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc construction/destruction
float xMinScreen,yMinScreen,xMaxScreen,yMaxScreen;
BOOL IsRectCross(float minx,float miny,float maxx,float maxy);
CDrawDoc::~CDrawDoc()
{
delete m_Index;
delete GraphSelect;
}
BOOL CDrawDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
COLORREF CGraphPara::GetColor(int n)
{
return m_ColorList[n];
}
BOOL CGraphPara::GetDisplayStatue(int n)
{
return m_LayerList[n].b_Display;
}
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc serialization
void CDrawDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
CLine* CDrawDoc::AddLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float X1,float Y1,float X2,float Y2)
{
CLine* p_Line=new CLine(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,X1,Y1,X2,Y2);
m_LineArray.Add(p_Line);
return p_Line;
return NULL;
}
CCircle* CDrawDoc::AddCircle(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL bFill)
{
CCircle* p_Circle=new CCircle(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,bFill);
m_CircleArray.Add(p_Circle);
return p_Circle;
return NULL;
}
CArc* CDrawDoc::AddArc(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,float Angle1,float Angle2)
{
CArc* p_Arc=new CArc( ColorPen, ColorBrush, LineWide, LineType, Layer, id_only,0, CircleX, CircleY, CircleR, Angle1, Angle2);
m_ArcArray.Add(p_Arc);
return p_Arc;
return NULL;
}
CText* CDrawDoc::AddText(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,float StartX,float StartY,float Angle1,float Angle2,float TextHeight,float TextWide,float OffWide,unsigned char TextFont,int TextLong,CString Text)
{
CText* p_Text=new CText(ColorPen, ColorBrush, LineWide, LineType, Layer, id_only,0, StartX, StartY, Angle1, Angle2, TextHeight, TextWide, OffWide,0,Text);
m_TextArray.Add(p_Text);
return p_Text;
return NULL;
}
/*CTag* CDrawDoc::AddTag(short ColorPen,int Layer,float xInsert,float yInsert,float xScale,float yScale,float angle,int only_id,int idBlock)
{
CTag* p_Tag=new CTag( ColorPen, Layer,0, xInsert, yInsert, xScale, yScale, angle, only_id, idBlock);
m_TagArray.Add(p_Tag);
return p_Tag;
}*/
CPline* CDrawDoc::AddPLine(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointList)
{
CPline* p_Pline=new CPline( ColorPen, ColorBrush, LineWide, LineType, Layer, id_only,0, Numble,PointList);
m_PLineArray.Add(p_Pline);
return p_Pline;
return NULL;
}
CPlineRgn* CDrawDoc::AddPLineRgn(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,int id_only,int Numble,PointStruct *PointList,BOOL bTransparent,BOOL bFill)
{
CPlineRgn* p_PlineRgn=new CPlineRgn( ColorPen, ColorBrush, LineWide, LineType, Layer, id_only,0, Numble,PointList, bTransparent, bFill);
m_PLineRgnArray.Add(p_PlineRgn);
return p_PlineRgn;
return NULL;
}
CLinkNet* CDrawDoc::AddNetPoint(float x,float y,float rRadiu,short Layer,int id_only,short ColorPen)
{
CLinkNet* p_Net=new CLinkNet( ColorPen, x, y, rRadiu, Layer, id_only);
m_NetArray.Add(p_Net);
return p_Net;
return NULL;
}
CDraw* CDrawDoc::GetGraph(short Lb,int index)
{
switch(Lb)
{
case 1:
if(index<0||index>m_LineArray.GetUpperBound())
return 0;
return m_LineArray.GetAt(index);
break;
case 2:
if(index<0||index>m_PLineArray.GetUpperBound())
return 0;
return m_PLineArray.GetAt(index);
break;
case 3:
if(index<0||index>m_CircleArray.GetUpperBound())
return 0;
return m_CircleArray.GetAt(index);
break;
case 4:
if(index<0||index>m_ArcArray.GetUpperBound())
return 0;
return m_ArcArray.GetAt(index);
break;
case 5:
if(index<0||index>m_TextArray.GetUpperBound())
return 0;
return m_TextArray.GetAt(index);
break;
case 6:
if(index<0||index>m_TagArray.GetUpperBound())
return 0;
return m_TagArray.GetAt(index);
break;
case 7:
if(index<0||index>m_PLineRgnArray.GetUpperBound())
return 0;
return m_PLineRgnArray.GetAt(index);
break;
case 8:
if(index<0||index>m_NetArray.GetUpperBound())
return 0;
return m_NetArray.GetAt(index);
break;
default:
return 0;
}
}
void CDrawDoc::DeleteGraph(short Lb,int index)
{
switch(Lb)
{
case 1:
if(index<0||index>m_LineArray.GetUpperBound())
return ;
m_LineArray.RemoveAt(index);
break;
case 2:
if(index<0||index>m_PLineArray.GetUpperBound())
return ;
m_PLineArray.RemoveAt(index);
break;
case 3:
if(index<0||index>m_CircleArray.GetUpperBound())
return ;
m_CircleArray.RemoveAt(index);
break;
case 4:
if(index<0||index>m_ArcArray.GetUpperBound())
return ;
m_ArcArray.RemoveAt(index);
break;
case 5:
if(index<0||index>m_TextArray.GetUpperBound())
return ;
m_TextArray.RemoveAt(index);
break;
case 6:
if(index<0||index>m_TagArray.GetUpperBound())
return ;
m_TagArray.RemoveAt(index);
break;
case 7:
if(index<0||index>m_PLineRgnArray.GetUpperBound())
return ;
m_PLineRgnArray.RemoveAt(index);
break;
case 8:
if(index<0||index>m_NetArray.GetUpperBound())
return ;
m_NetArray.RemoveAt(index);
break;
default:
return;
}
}
int CDrawDoc::GetGraphNumb(short Lb)
{
switch(Lb)
{
case 1:
return m_LineArray.GetSize();
break;
case 2:
return m_PLineArray.GetSize();
break;
case 3:
return m_CircleArray.GetSize();
break;
case 4:
return m_ArcArray.GetSize();
break;
case 5:
return m_TextArray.GetSize();
break;
case 6:
return m_TagArray.GetSize();
break;
case 7:
return m_PLineRgnArray.GetSize();
break;
case 8:
return m_NetArray.GetSize();
break;
default:
return 0;
}
}
int CDrawDoc::GetGraphUpperBound(short Lb)
{
switch(Lb)
{
case 1:
return m_LineArray.GetUpperBound();
break;
case 2:
return m_PLineArray.GetUpperBound();
break;
case 3:
return m_CircleArray.GetUpperBound();
break;
case 4:
return m_ArcArray.GetUpperBound();
break;
case 5:
return m_TextArray.GetUpperBound();
break;
case 6:
return m_TagArray.GetUpperBound();
break;
case 7:
return m_PLineRgnArray.GetUpperBound();
break;
case 8:
return m_NetArray.GetUpperBound();
break;
default:
return -1;
break;
}
return -1;
}
int CDrawDoc::GetGraphIndex(short Lb,int ID)
{
int nn=this->GetGraphUpperBound(Lb)+1;
for(int i=0;iGetGraph(Lb,i);
if(pDraw&&pDraw->GetID()==ID)
{
return i;
}
}
return -1;
}
CLinkNet* CDrawDoc::AddNetLink(float sID,float eID)
{
int xh=this->GetGraphIndex(8,(int)sID);
CLinkNet* pNet=NULL;
if(xh>=0)
{
pNet=(CLinkNet*)GetGraph(8,xh);
pNet->AddLink((int)eID);
}
return pNet;
}
BOOL CDrawDoc::GetNetXy(int netID,float *x,float *y,BOOL *bDelete)
{
int nn=this->GetGraphIndex(8,netID);
if(nn<0)
return FALSE;
CLinkNet* pNet=(CLinkNet*)GetGraph(8,nn);
*bDelete=pNet->b_Delete;
*x=pNet->m_x;
*y=pNet->m_y;
return TRUE;
}
void CDrawDoc::Draw(CDC* pDC,int m_DrawMode,int m_DrawModel,short BackColor)
{
for(int i=0;i<=8;i++)
{
int nn=GetGraphUpperBound(i)+1;
while(nn--)
GetGraph(i,nn)->Draw(pDC,m_DrawMode,m_DrawModel,BackColor);
}
//实现对被选中的图形元素的特殊绘制
for(i=0;iGetID()]=1;
}
for(i=0;i<30000;i++)
{
if(m_Index[i]==0)
return i;
}
return -1;
}
float CDrawDoc::GetAngle(float xx,float yy,float m_x,float m_y)
{
float i;
i=(float)acos((m_x-xx)/sqrt((m_y-yy)*(m_y-yy)+(m_x-xx)*(m_x-xx)));
return i;
}
void CArc::Init(short ColorPen,short ColorBrush,float LineWide,short LineType,short Layer,BOOL Delete,float CircleX,float CircleY,float CircleR,float Angle1,float Angle2)
{
m_ColorPen=ColorPen;
m_ColorBrush=ColorBrush;
m_LineWide=LineWide;
m_LineType=LineType;
m_Layer=Layer;
m_CircleX=CircleX;
m_CircleY=CircleY;
m_CircleR=CircleR;
m_Angle1=Angle1;
m_Angle2=Angle2;
b_Delete=Delete;
}
BOOL CDrawDoc::PointSelect(float x,float y,float j1,float blc,int *Lb,int* index,int* id_only)
{
for(int i=0;i<=8;i++)
{
int nn=GetGraphUpperBound(i)+1;
while(nn--)
{
if(GetGraph(i,nn)->IsPoint(x,y,j1,blc))
{
*index=nn;
*Lb=i;
*id_only=GetGraph(i,nn)->GetID();
return TRUE;
}
}
}
return FALSE;
}
float CalDisp(int x,int y,int m_x,int m_y)
{
float l;
l=(float)(sqrt((m_x-x)*(m_x-x)+(m_y-y)*(m_y-y)));
return l;
}
void CDrawDoc::AddScreen(float StartX,float StartY,float blc)
{
int i;
if(m_CurrentScreen==m_MaxScreen)
{
for(i=1;iGetRect(&m_minX,&m_minY,&m_maxX,&m_maxY);
else
continue;
pb=1;
if(*m_Xmin>m_minX)
*m_Xmin=m_minX;
if(*m_Xmaxm_minY)
*m_Ymin=m_minY;
if(*m_YmaxxMaxScreen||maxxyMaxScreen||maxyDraw(pDC,DrawMode,DrawModel,BackColor);
}
/*BOOL CDrawDoc::PointSelect(float x,float y,float j1,float blc,int *Lb,int *index,int * id_only)
{
for(int i=1;i<=8;i++)
{
int nn=GetGraphUpperBound(i)+1;
while(nn--)
{
if(GetGraph(i,nn)->IsPoint(x,y,j1,blc))
{
*index=nn;
*Lb=i;
*id_only=GetGraph(i,nn)->GetID();
return TRUE;
}
}
}
return FALSE;
}*/
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc diagnostics
#ifdef _DEBUG
void CDrawDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CDrawDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawDoc commands