东南大学MFC课程设计报告模板.docx
《东南大学MFC课程设计报告模板.docx》由会员分享,可在线阅读,更多相关《东南大学MFC课程设计报告模板.docx(21页珍藏版)》请在冰点文库上搜索。
东南大学MFC课程设计报告模板
MFC课程设计报告
——简易数控车床模拟
姓名:
学号:
指导教师:
院系:
日期:
2013.10.10
SimpleCNCLatheImitation
Abstract:
ThisprocedurecanbeusedtodrawasimpleimageofpartmadebyCNClathe.G01,G02,G03codecanbeused.Itcansavecodeandimage,sothatitisabletobeanassistanceproceduretolearnhowtouseaCNClathe.
Keywords:
Drawing,CNClathe,Gcode
第一章绪论
1.1引言
数控车床(CNCLathe)是机械工业中最常用的机床之一,能够加工各种各样的回转体零件。
数控车床是将数控系统和普通车床结合在一起的发明,在当今工业领域有广泛的应用。
以FANUC车床为例,通过向数控系统输入G代码,可以实现零件的加工。
东南大学机械工程及其自动化专业的学生在工培中心使用了此种车床。
然而,在使用程序之前,输入程序者如果输入了没有语法错误的G代码,却可能损伤刀具,这不仅会损坏车床,还会造成安全事故,所以,学生们需要一款能够检验G代码的程序。
本报告将会就目前的程序进度做出说明。
1.2编程思路
通过使用对话框来获取G代码的各项数据,储存到文档类中,再由视图类输出到屏幕上。
经分析,程序逻辑并不复杂,而难点在于如何存储各项数据以及利用各项数据画图。
1.3设计目标和设计任务
目标:
设计一款能够识别G代码并作出相应零件图形的软件,还能够进行语法检查和动画模拟,方便学生使用。
任务:
分成以下几个部分,G代码读取存储,绘图,语法检查,动画模拟。
第二章程序设计
2.1毛坯件初始化
首先,要进行动画演示,首先需要一个毛坯件。
使用模态对话框获取毛坯件的大小,即毛坯件的直径和长度。
具体代码见附录。
2.2G代码对话框
要记录G代码,首先要定义数据类型。
因为G代码是由一连串的指令构成,如果采用简单的数组的话,势必会造成困难,在此采用结构体数组的形式记录G代码指令。
结构体如下:
structcode
{
CStringname;//G代码种类
floatx;
floatz;
floatf;
floatu;
floatr;
floatp;
floatq;
floatu2;
floatw;
intkind;//kind=0,不执行,只显示内容;kind=1,执行,并记录内容;kind=2,循环条件
};
至此,G代码所需要的各种数据已全部包含在这个结构体数组中,因此,只需要输入各项数据即可。
采用下拉式组合框的形式选择代码种类,创建子对话框来输入数据。
举例如下:
…………
UpdateData(true);
if(m_selection.GetCurSel()==0)
{CDialogOdlg0;
if(dlg0.DoModal()==IDOK)
{
CodeNow.name="";
CodeNow.x=0;
CodeNow.z=0;
CodeNow.f=0;
CodeNow.u=0;
CodeNow.r=0;
CodeNow.p=0;
CodeNow.q=0;
CodeNow.u2=0;
CodeNow.w=0;
CodeNow.kind=0;
CodeNow.name=dlg0.m_edito;
CodeNow.kind=0;
}
SetDlgItemText(IDC_INSTRUCTION,"文件名");
SetDlgItemText(IDC_CODENOW,CodeNow.name);
}
…………
CodeNow记录当前结构体的数据
当前数据通过添加到列表框的方式进行编辑,添加函数如下:
voidCGCode:
:
OnButtonadd()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
intnIndex=m_list.AddString(CodeNow.name);
codecd;
cd.name=CodeNow.name;
cd.x=CodeNow.x;
cd.z=CodeNow.z;
cd.f=CodeNow.f;
cd.u=CodeNow.u;
cd.r=CodeNow.r;
cd.p=CodeNow.p;
cd.q=CodeNow.q;
cd.u2=CodeNow.u2;
cd.w=CodeNow.w;
cd.kind=CodeNow.kind;
m_list.SetItemDataPtr(nIndex,newcode(cd));
pDoc->m_index++;
}
删除函数如下:
intnIndex=m_list.GetCurSel();
if(nIndex!
=LB_ERR)
{
delete(code*)m_list.GetItemDataPtr(nIndex);
m_list.DeleteString(nIndex);
SetDlgItemText(IDC_INSTRUCTION,"当前无说明!
");
SetDlgItemText(IDC_CODENOW,"当前无代码!
");
}
else
MessageBox("没有选择代码或操作失败!
");
pDoc->m_index--;
之后则要通过文档类指针将这些已经序列化的值储存起来,如下:
……
code*pc;
for(inti=0;im_index;i++)
{
pc=(code*)m_list.GetItemDataPtr(i);
pDoc->gcode[i].name=pc->name;
pDoc->gcode[i].x=pc->x;
pDoc->gcode[i].z=pc->z;
pDoc->gcode[i].f=pc->f;
pDoc->gcode[i].u=pc->u;
pDoc->gcode[i].r=pc->r;
pDoc->gcode[i].p=pc->p;
pDoc->gcode[i].q=pc->q;
pDoc->gcode[i].u2=pc->u2;
pDoc->gcode[i].w=pc->w;
pDoc->gcode[i].kind=pc->kind;
}
CClientDCdc(pView);
…………
绘图采用先判断代码种类,再进行画图的方式,以G01代码为例:
……
for(inti=0;im_index;i++)
{
if(pDoc->gcode[i].name=="G01")
{
pDC->MoveTo(ptu);
pDC->LineTo(400-pDoc->gcode[i].x,200-pDoc->gcode[i].z);
ptu.x=400-pDoc->gcode[i].x;
ptu.y=200-pDoc->gcode[i].z;
pDC->MoveTo(ptd);
pDC->LineTo(400-pDoc->gcode[i].x,200+pDoc->gcode[i].z);
ptd.x=400-pDoc->gcode[i].x;
ptd.y=200+pDoc->gcode[i].z;
}
……
至此,G代码储存以及画图都已经完成。
2.3检查以及动画
通过对于代码的判断可实现语法检查。
动画的实现则通过循环延迟绘图来实现,通过每500毫秒更新视图的方式实现动画。
2.4帮助
为了方便学习,应该将各种代码写成索引。
第三章程序测试
3.1测试数据
G01X15Z15
G02X30Z30R15
G03X45Z45R15
3.2运行情况分析
通过代码输入,储存,可以记录G代码,如图2-1;
画出零件,如图2-2;
程序使用界面如图2-3;
图2-1
图2-2
图2-3
第四章总结
4.1设计小结
这款软件的设计思路清晰,但是实施起来比较困难。
在设计中遇到了很多问题,比如变量太多,函数复杂,画图数据变化问题,都是值得思考的问题。
程序编写没有达到预期目的,即没有完成检查和动画功能,但是G代码绘图部分已有其功能,可以满足数控车床初学者的需要。
我相信如果今后花费更多的时间就能够做出来。
4.2心得体会
通过这次设计程序,我学到了如何整理思路去设计一个新的程序。
更加熟练掌握了各项控件的使用和对话框的使用,并且对于文档类有了更深的理解。
虽然动画部分没有完成,但是为以后的设计指明了方向。
以后我会继续设计此程序,争取完成。
4.3参考资料
《VisualC++程序设计与应用教程》/马石安,魏文平编著.—北京:
清华大学出版社,2007.9
4.4致谢
感谢窦建平老师和同学们给予我的指导。
第五章附录
5.1调试截图
此处错误是忽略头文件所致
5.2代码
毛坯件
voidCBlank:
:
OnOK()
{
//TODO:
Addextravalidationhere
UpdateData(true);
CCNCLatheView*pView=(CCNCLatheView*)((CFrameWnd*)AfxGetMainWnd())->GetActiveView();
CCNCLatheDoc*pDoc=pView->GetDocument();
CClientDCdc(pView);
pDoc->m_blength=m_length;
pDoc->m_bdiameter=m_diameter;
CBrush*BrushOld,BrushNew;
BrushNew.CreateSolidBrush(RGB(192,192,192));
BrushOld=dc.SelectObject(&BrushNew);
dc.Rectangle(100,100-m_diameter/2,100+m_length,100+m_diameter/2);
dc.SelectObject(BrushOld);
BrushNew.DeleteObject();
CDialog:
:
OnOK();
}
对话框类代码
#include"stdafx.h"
#include"CNCLathe.h"
#include"GCode.h"
#include"DialogO.h"
#include"DialogS.h"
#include"DialogT.h"
#include"DialogG01.h"
#include"DialogG71.h"
#include"DialogT.h"
#include"DialogG03.h"
#include"DialogG02.h"
#include"CNCLatheView.h"
#include"CNCLatheDoc.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CGCodedialog
CGCode:
:
CGCode(CWnd*pParent/*=NULL*/)
:
CDialog(CGCode:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CGCode)
//}}AFX_DATA_INIT
CodeNow.name="";
CodeNow.x=0;
CodeNow.z=0;
CodeNow.f=0;
CodeNow.u=0;
CodeNow.r=0;
CodeNow.p=0;
CodeNow.q=0;
CodeNow.u2=0;
CodeNow.w=0;
CodeNow.kind=0;
m_pParent=(CCNCLatheView*)pParent;
pView=(CCNCLatheView*)((CFrameWnd*)AfxGetMainWnd())->GetActiveView();
pDoc=pView->GetDocument();
ptu.x=400;
ptu.y=200;
ptd.x=400;
ptd.y=200;
}
/////////////////////////////////////////////////////////////////////////////
//CGCodemessagehandlers
voidCGCode:
:
OnButtonadd()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
intnIndex=m_list.AddString(CodeNow.name);
codecd;
cd.name=CodeNow.name;
cd.x=CodeNow.x;
cd.z=CodeNow.z;
cd.f=CodeNow.f;
cd.u=CodeNow.u;
cd.r=CodeNow.r;
cd.p=CodeNow.p;
cd.q=CodeNow.q;
cd.u2=CodeNow.u2;
cd.w=CodeNow.w;
cd.kind=CodeNow.kind;
m_list.SetItemDataPtr(nIndex,newcode(cd));
pDoc->m_index++;
}
voidCGCode:
:
OnButtondelete()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intnIndex=m_list.GetCurSel();
if(nIndex!
=LB_ERR)
{
delete(code*)m_list.GetItemDataPtr(nIndex);
m_list.DeleteString(nIndex);
SetDlgItemText(IDC_INSTRUCTION,"当前无说明!
");
SetDlgItemText(IDC_CODENOW,"当前无代码!
");
}
else
MessageBox("没有选择代码或操作失败!
");
pDoc->m_index--;
}
voidCGCode:
:
OnOK()
{
//TODO:
Addextravalidationhere
code*pc;
for(inti=0;im_index;i++)
{
pc=(code*)m_list.GetItemDataPtr(i);
pDoc->gcode[i].name=pc->name;
pDoc->gcode[i].x=pc->x;
pDoc->gcode[i].z=pc->z;
pDoc->gcode[i].f=pc->f;
pDoc->gcode[i].u=pc->u;
pDoc->gcode[i].r=pc->r;
pDoc->gcode[i].p=pc->p;
pDoc->gcode[i].q=pc->q;
pDoc->gcode[i].u2=pc->u2;
pDoc->gcode[i].w=pc->w;
pDoc->gcode[i].kind=pc->kind;
}
CClientDCdc(pView);
for(i=0;im_index;i++)
{
if(pDoc->gcode[i].name=="G01")
{
dc.MoveTo(ptu);
dc.LineTo(400-pDoc->gcode[i].x,200-pDoc->gcode[i].z);
ptu.x=400-pDoc->gcode[i].x;
ptu.y=200-pDoc->gcode[i].z;
dc.MoveTo(ptd);
dc.LineTo(400-pDoc->gcode[i].x,200+pDoc->gcode[i].z);
ptd.x=400-pDoc->gcode[i].x;
ptd.y=200+pDoc->gcode[i].z;
}
if(pDoc->gcode[i].name=="G02")
{
dc.AngleArc(ptu.x,ptu.y-pDoc->gcode[i].r,pDoc->gcode[i].r,270,360);
CPen*PenOld,PenNew;
PenOld=(CPen*)dc.SelectStockObject(BLACK_PEN);
PenNew.CreateStockObject(WHITE_PEN);
dc.SelectObject(&PenNew);
dc.AngleArc(ptu.x,ptu.y-pDoc->gcode[i].r,pDoc->gcode[i].r,270,270);
dc.SelectObject(PenOld);
ptu.x=400-pDoc->gcode[i].x;
ptu.y=200-pDoc->gcode[i].z;
dc.MoveTo(ptd);//dc.SelectStockObject(BLACK_PEN);
dc.AngleArc(ptd.x,ptd.y+pDoc->gcode[i].r,pDoc->gcode[i].r,90,90);
ptd.x=400-pDoc->gcode[i].x;
ptd.y=200+pDoc->gcode[i].z;
}
if(pDoc->gcode[i].name=="G03")
{
dc.AngleArc(ptu.x-pDoc->gcode[i].r,ptu.y,pDoc->gcode[i].r,0,90);
CPen*PenOld,PenNew;
ptu.x=400-pDoc->gcode[i].x;
ptu.y=200-pDoc->gcode[i].z;
dc.MoveTo(ptd);
dc.AngleArc(ptd.x-pDoc->gcode[i].r,ptd.y,pDoc->gcode[i].r,0,360);
PenOld=(CPen*)dc.SelectStockObject(BLACK_PEN);
PenNew.CreateStockObject(WHITE_PEN);
dc.SelectObject(&PenNew);
dc.AngleArc(ptd.x-pDoc->gcode[i].r,ptd.y,pDoc->gcode[i].r,0,270);
dc.SelectObject(PenOld);
ptd.x=400-pDoc->gcode[i].x;
ptd.y=200+pDoc->gcode[i].z;
}
}
CDialog:
:
OnOK();
}
voidCGCode:
:
OnCancel()
{
//TODO:
Addextracleanuphere
if(m_pParent!
=NULL)
{
CWnd:
:
ShowWindow(SW_HIDE);
}
CDialog:
:
OnCancel();
}
绘图代码
voidCCNCLatheView:
:
OnDraw(CDC*pDC)
{
CCNCLatheDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CBrush*BrushOld,BrushNew;
BrushNew.CreateSolidBrush(RGB(192,192,192));
BrushOld=pDC->SelectObject(&BrushNew);
pDC->Rectangle(100,100-pDoc->m_bdiameter,100+pDoc->m_blength,100+pDoc->m_bdiameter);
pDC->SelectObject(BrushOld);
BrushNew.DeleteObject();
CPointptu,ptd;
ptu.x=400;
ptu.y=200;
ptd.x=400;
ptd.y=200;
for(inti=0;im_index;i++)
{
if(pDoc->gcode[i].name=="G01")
{
pDC->MoveTo(ptu);
pDC->LineTo(400-pDoc->gcode[i].x,200-pDoc->gcode[i].z);
ptu.x=400-pDoc->gcode[i].x;
ptu.y=200-pDoc->gcode[i].z;
pDC->MoveTo(ptd);
pDC->LineTo(400-pDoc->gcode[i].x,200+pDoc->gcode[i].z);
ptd.x=400-pDoc->gcode[i].x;
ptd.y=200+pDoc->gcode[i].z;
}
if(pDoc->gcode[i].name=="G02")
{
pDC->AngleArc(ptu.x,ptu.y-pDoc->gcode[i].r,pDoc->gcode[i].r,270,360);
CPen*PenOld,PenNew;
PenOld=(CPen*)pDC->SelectStockObject(BLACK_PEN);
PenNew.CreateStockObject(WHITE_PEN);