⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawdoc.cpp

📁 VC做的矢量画图程序!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	return pPline;
}

//增加一个圆对象
CCircle* CDrawDoc::AddCircle(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL Fill)
{	
	CCircle* p_Circle=new CCircle(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,Fill);
	m_CircleArray.Add(p_Circle);
	return p_Circle;
}

//增加一个圆对象(不初始化数据成员)
CCircle* CDrawDoc::AddCircle()
{	
	CCircle* p_Circle=new CCircle();
	m_CircleArray.Add(p_Circle);
	return p_Circle;
}

CCircle* CDrawDoc::AddCircle(CCircle* pCircle)
{	
	m_CircleArray.Add(pCircle);
	return pCircle;
}

//增加一个圆弧对象
CArc* CDrawDoc::AddArc(short ColorPen,short ColorBrush,short LineWide,short LineType,short Layer,int id_only,float CircleX,float CircleY,float CircleR,BOOL Fill,float Angle1,float Angle2)	
{
	CArc* p_Arc=new CArc(ColorPen,ColorBrush,LineWide,LineType,Layer,id_only,0,CircleX,CircleY,CircleR,Fill,Angle1,Angle2);
	m_ArcArray.Add(p_Arc);
	return p_Arc;
}

//增加一个圆弧对象(不初始化数据成员)
CArc* CDrawDoc::AddArc()
{
	CArc* p_Arc=new CArc();
	m_ArcArray.Add(p_Arc);
	return p_Arc;
}

CArc* CDrawDoc::AddArc(CArc* pArc)
{
	m_ArcArray.Add(pArc);
	return pArc;
}

//增加一个标注文本对象
CText* CDrawDoc::AddText(short ColorPen,short ColorBrush,short 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;
}

//增加一个标注文本对象(不初始化数据成员)
CText* CDrawDoc::AddText()
{
	CText* p_Text=new CText();
	m_TextArray.Add(p_Text);
	return p_Text;
}

CText* CDrawDoc::AddText(CText* pText)
{
	m_TextArray.Add(pText);
	return pText;
}

//增加一个图例对象
CTag* CDrawDoc::AddTag(short ColorPen,short ColorBrush,short LineWide,short LineType,
		short Layer,float xInsert,float yInsert,float x_Scale,float y_Scale,int only_id,CBlock *pBlock)
{
	CTag* p_Tag=new CTag(ColorPen,ColorBrush,LineWide,LineType,Layer,0,xInsert,
		yInsert,x_Scale,y_Scale,only_id,pBlock);
	m_TagArray.Add(p_Tag);
	return p_Tag;
}

CTag* CDrawDoc::AddTag(CTag* pTag)
{
	m_TagArray.Add(pTag);
	return pTag;
}


//得到某个图形块对象的在指针,Index-图形块对象的序号
CBlock* CDrawDoc::GetBlock(int Index)
{
	if(Index<0||Index>m_BlockArray.GetUpperBound())
		return 0;
	return (CBlock *)m_BlockArray.GetAt(Index);
}

//得到并返回图形块的数目(最大上标加1)
int CDrawDoc::GetBlockUpperbound()
{
	return m_BlockArray.GetUpperBound()+1;
}

//得到某个图形块对象的序号,iD-图形块对象的识别号
int CDrawDoc::GetBlockIndex(int iD)
{
	int nn=GetBlockUpperbound();
	while(nn--)
	{
		p_Block=GetBlock(nn);
		if(iD==p_Block->m_iD)
			return nn;
	}
	return -1;
}

//设置各个图例指向的图形块对象指针
void CDrawDoc::SetBlockPoint()
{
	int nn=GetGraphNumb(6);	//得到图例的数目
	CTag* p_Tag;
	while(nn--)				//对所有图例循环
	{
		p_Tag=(CTag *)GetGraph(6,nn);
		if(p_Tag)
			p_Tag->SetBlock(GetBlock(GetBlockIndex(p_Tag->idBlock)));
	}
}

//增加一个空的图形块对象
CBlock* CDrawDoc::AddBlock()
{
	int Index[1000];
	for(int i=0;i<1000;i++)
		Index[i]=-1;
	int nn=m_BlockArray.GetUpperBound()+1;
	while(nn--)
	{
		if(GetBlock(nn))
			Index[GetBlock(nn)->m_iD]=1;
	}
	for(i=0;i<1000;i++)
	{
		if(Index[i]<0)
		{
			break;
		}
	}
	CString string1="C:\\代码盘A13\\TAG\\tag";
	char p1[5];
	sprintf(p1,"%d",i);
	string1+=p1;
	string1+=".tmp";
	CBlock* pBlock=new CBlock(i,string1);
	m_BlockArray.Add((CObArray*)pBlock);
	return pBlock;
}


//完成增加图形块的操作
void CDrawDoc::OnBlockAdd(float x,float y) 
{
	CTag *pTag;
	if(n_GraphSelect<=0)	//选中图形元素的数目
		return;				
	CBlock* pBlock=AddBlock();
	for(int i=0;i<n_GraphSelect;i++)	//对所有选中的图形元素循环
	{
		if(GraphSelect[i].Lb>=1&&GraphSelect[i].Lb<=5)
			pBlock->AddGraph(GetGraph(GraphSelect[i].Lb,GraphSelect[i].Index));
	}
	int numb=pBlock->GetGraphNumb(0);
	for(i=0;i<n_GraphSelect;i++)	//对所有选中的图形元素循环
	{
		if(GraphSelect[i].Lb==6)	//如果图形元素是图例
		{
			pTag=(CTag *)GetGraph(6,GraphSelect[i].Index);
			if(pTag&&!pTag->IsDelete())
			{
				pTag->AddBlock(pBlock);
			}
		}
	}
	pBlock->SetInsertPoint(x,y);
	pBlock->ReadFile(0);			//保存图形块到文件
	pBlock->CalRect();
	if(numb<0)
		numb=0;
	//以下清除那些图例中的图形元素的对象
	for(i=numb;i<pBlock->GetGraphNumb(0);i++)
		pBlock->DeleteGraph(i);
	pBlock->Clear(0);		//清除图形块的内容
}

//保存对图形块的编辑,退出图形块编辑状态
void CDrawDoc::OnEditBlockOk()
{
	CBlock* pBlock;	
	CDraw *pDraw;
	CTag *pTag;
	int numb;
	if(m_DrawEdit==1)
		pBlock=AddBlock();	//增加新图形块
	else if(m_DrawEdit==2)	//修改既有图形块
	{
		pBlock=GetBlock(EditBlockIndex);
		pBlock->Clear(0);
	}//
	else if(m_DrawEdit==3)	//修改电子表格
	{
		x_Insert=0;
		y_Insert=0;
		pBlock=p_Form;
		pBlock->Clear(0);
	}
	for(int i=1;i<=7;i++)
	{
		if(i==6)	//如果是图例
			continue;
		int nn=GetGraphNumb(i);			//得到第i类图形元素的数目	
		while(nn-->GraphNumbStart[i-1])	//遍历所有的图形元素
		{
			pDraw=GetGraph(i,nn);
			if(pDraw&&!pDraw->IsDelete())
				pBlock->AddGraph(pDraw);
		}
	}
	numb=pBlock->GetGraphNumb(0);
	int nn=GetGraphNumb(6);				//得到图例的数目	
	while(nn-->GraphNumbStart[5])		//遍历所有的图例
	{
		pTag=(CTag *)GetGraph(6,nn);
		if(pTag&&!pTag->IsDelete())
		{
			pTag->AddBlock(pBlock);
		}
	}
//	if(!m_DrawEdit)
//		p_Block->Clear(1);
	pBlock->SetInsertPoint(x_Insert,y_Insert);
	pBlock->ReadFile(0);	//保存图形块(或电子表格)到文件
	pBlock->CalRect();
	if(numb<0)
		numb=0;
	//以下清除那些图例中的图形元素的对象
	for(i=numb;i<pBlock->GetGraphNumb(0);i++)
		pBlock->DeleteGraph(i);
	RestoreDraw();
	m_DrawEdit=0;			//恢复正常的图形绘制
	pBlock->Clear(0);		//清除图形块的内容
}

//放弃对图形块的编辑,退出图形块编辑状态
void CDrawDoc::OnEditBlockCancel()
{
	CBlock* pBlock;
	if(m_DrawEdit==2)	//修改既有图形块
	{
		pBlock=GetBlock(EditBlockIndex);
		pBlock->Clear(0);
	}
	else if(m_DrawEdit==3)	//修改电子表格
	{
		pBlock=p_Form;
		pBlock->Clear(0);
	}
	m_DrawEdit=0;			//恢复正常的图形绘制
	RestoreDraw();
}

//恢复原来的图形屏幕(在退出图形块(或电子表格)编辑状态后执行,恢复编辑图形块前的正常的屏幕)
void CDrawDoc::RestoreDraw()
{
	for(int i=1;i<=7;i++)
	{
		int nn=this->GetGraphUpperBound(i)+1;	//得到某类图形元素的数目
		while(nn-->GraphNumbStart[i-1])			//遍历此类所有的图形元素
		{
			if(GetGraph(i,nn))
			{
				delete GetGraph(i,nn);
				DeleteGraph(i,nn);
			}
		}
	}
	n_GraphSelect=0;
	for(i=0;i<10;i++)
		GraphNumbStart[i]=0;
	m_CurrentScreen=m_CurrentScreen1-1;
	m_CurrentScreen1=0;
	n_CurUnIndex=n_CurUnIndex1;
	n_CurUnIndex1=0;
}

//清除屏幕上的图形(在编辑图形块(或电子表格)前被调用,在去掉屏幕上的图形元素,进入图形块编辑状态)
void CDrawDoc::ClearDraw()
{
	for(int i=0;i<7;i++)
		GraphNumbStart[i]=GetGraphNumb(i+1);
	n_GraphSelect=0;
	m_CurrentScreen1=m_CurrentScreen+1;
	m_CurrentScreen=m_CurrentScreen+1;
	m_Screen[m_CurrentScreen].sx=0;
	m_Screen[m_CurrentScreen].sy=0;
	m_Screen[m_CurrentScreen].blc=1;
	n_CurUnIndex1=n_CurUnIndex;
}

//调用图形块管理对话框
int CDrawDoc::OnBlockDialog() 
{
	BlockDialog pDlg1(this,BlockIndex,m_DrawEdit==0);
	UINT nReturn;
	nReturn=pDlg1.DoModal();
	if(nReturn==IDOK)	//按“关闭”按钮退出对话框
	{
		BlockIndex=pDlg1.m_BlockIndex;
		return 1;
	}
	else if(nReturn==ID_BLOCK_NEW)	//按“新建图形块”按钮退出对话框
	{
		BlockIndex=pDlg1.m_BlockIndex;
		EditBlockIndex=-1;
		ClearDraw();
		m_DrawEdit=1;	//新建图形块
		return 2;
	}
	else if(nReturn==IDD_BLOCK_MODIFY)//按“修改图形块”退出对话框
	{
		BlockIndex=pDlg1.m_BlockIndex;
		EditBlockIndex=BlockIndex;
		p_Block=GetBlock(BlockIndex);
		if(!p_Block->isOpen())
			p_Block->ReadFile(1);			//从文件中读出图形块
		ClearDraw();
		int nn=p_Block->GetGraphNumb(0);	//得到图形元素的数量
		while(nn--)							//得到并增加各个图形元素对象
		{
			CDraw* pDraw=p_Block->GetGraph(nn);
			if(pDraw)
			{
				int lb=pDraw->GetGraphLb();
				if(lb==1)
					m_LineArray.Add((CLine *)pDraw);
				else if(lb==2)
					m_PLineArray.Add((CPline *)pDraw);
				else if(lb==3)
					m_CircleArray.Add((CCircle *)pDraw);
				else if(lb==4)
					m_ArcArray.Add((CArc *)pDraw);
				else if(lb==5)
					m_TextArray.Add((CText *)pDraw);
				else if(lb==7)
					m_FormrgnArray.Add((CFormrgn *)pDraw);
			}
		}
		m_DrawEdit=2;	//修改既有图例
		return 3;
	}
	return 0;
}




////////////////////////////////////////////////////////////////////////////
// CDrawDoc diagnostics

#ifdef _DEBUG
void CDrawDoc::AssertValid() const
{
	COleDocument::AssertValid();
}

void CDrawDoc::Dump(CDumpContext& dc) const
{
	COleDocument::Dump(dc);
}
#endif //_DEBUG

//图形参数类的串行化函数
void CGraphPara::Serialize(CArchive& ar)
{
	CString m_str;
	if(ar.IsStoring())	//若干是保存操作
	{
		ar<<n_ColorNumb<<n_LayerNumb;
		for(int i=0;i<n_ColorNumb;i++)
			ar<<m_ColorList[i];
		for(i=0;i<n_LayerNumb;i++)
		{
			m_str=m_LayerList[i].m_Name;
			ar<<m_str;
			ar<<m_LayerList[i].b_Display;
		}
	}
	else				//如果是读取操作
	{
		ar>>n_ColorNumb>>n_LayerNumb;
		for(int i=0;i<n_ColorNumb;i++)
			ar>>m_ColorList[i];
		for(i=0;i<n_LayerNumb;i++)
		{
			ar>>m_str;
			strcpy(m_LayerList[i].m_Name,(const char *)m_str);
			ar>>m_LayerList[i].b_Display;
		}
	}
}

//得到某个颜色的实际值,n-颜色序号
COLORREF CGraphPara::GetColor(int n)
{
	return m_ColorList[n]; //返回第n种颜色的实际值
}

//得到某个图层的显示状态,n-图层序号
BOOL CGraphPara::GetDisplayStatue(int n)
{
	if(n<0||n>this->n_LayerNumb)	//如果层的序号不在层的范围内
		return FALSE;
	return m_LayerList[n].b_Display;

}

//计算点(x1,y1)与点(x2,y2)间的距离
float CDraw::CalDisp(float x1,float y1,float x2,float y2)
{
	return (float)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}


void CDraw::Move(float x_Move,float y_Move)
{

}

void CDraw::Scale(float x_Base,float y_Base,float x_scale,float y_scale)
{

}

//检查一个图形元素是否填充
BOOL CDraw::IsFill()
{
	return FALSE;
}

//得到图形元素的图形类别
short CDraw::GetGraphLb()
{
	return m_Lb;
}

//读取DXF文件的函数
BOOL CDraw::dxfRead(CStdioFile* pFile)
{
	return TRUE;
}

//写成DXF文件的函数
void CDraw::dxfWrite(CStdioFile* pFile)
{

}

//作用:计算点(xx,yy)到线段(x1,y1)(x2,y2)的距离,返回计算的距离值
float CDraw::PointLine(float xx,float yy,float x1,float y1,float x2,float y2)
{
	float a,b,c,ang1,ang2,ang;
    //计算三条边的距离
    a=CalDisp(x1,y1,xx,yy);if(a==0.0)return 0.0;
    b=CalDisp(x2,y2,xx,yy);if(b==0.0)return 0.0;
    c=CalDisp(x1,y1,x2,y2);
    //如果(x1,y1)和(x2,y2)是一个点直接返回距离
    if(c==0.0) return a;
	if(a<b) //如果(xx,yy)的点(x1,y1)这条边较短
	{
		if(y1==y2)
		{
			if(x1<x2)
				ang1=0;
			else
				ang1=(float)pi;
		}
		else
		{
			ang1=(float)acos((x2-x1)/c);
			if(y1>y2)ang1=(float)pi*2-ang1;  //直线(x1,y1)-(x2,y2)的弧度
		}
		ang2=(float)acos((xx-x1)/a);
		if(y1>yy)ang2=(float)pi*2-ang2;  //直线(x1,y1)-(xx,yy)的弧度
		ang=ang2-ang1;
		if(ang<0)ang=-ang;
		if(ang>pi) ang=(float)pi*2-ang;  //交角的大小
		if(ang>pi/2) return a;    //如果为钝角,直接返回距离
		else 
			return (a*(float)sin(ang)); //否则返回计算得到的距离 
	}
	else //如果(xx,yy)的点(x2,y2)这条边较短
	{
		if(y1==y2)
		{
			if(x1<x2)
				ang1=(float)pi;
			else
				ang1=0;
		}
		else
		{
			ang1=(float)acos((x1-x2)/c);     //直线(x2,y2)-(x1,y1)的斜率的弧度
			if(y2>y1)ang1=(float)pi*2-ang1;
		}
		ang2=(float)acos((xx-x2)/b);     //直线(x2,x1)-(xx,yy)的斜率的弧度
		if(y2>yy)ang2=(float)pi*2-ang2;
		ang=ang2-ang1;
		if(ang<0) ang=-ang;
		if(ang>pi) ang=(float)pi*2-ang;  //交角的大小 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -