📄 drawdoc.cpp
字号:
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 + -