




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录1内容提要…………22前期准备…………22.1编程软件的选择……………22.2DXF文件的结构……………23数控系统软件设计过程…………43.1、读入DXF文件…………………53.2提取相关圆弧和直线的坐标信息……………63.3排序……………83.4显示图形………………………93.5生成数控代码…………………143.6辅助功能………………………164软件使用说明…………………184.1欢迎界面……………………184.2程序主界面……………………184.3功能演示………………………195设计总结…………216参考文献…………217附录………………221内容提要据有关资料统计:用手工编程时,一个零件的编程时间与其实际加工时间的平均比例约为30:1。而数控机床无法启动进行加工的原因中,有20%-30%是由于加工程序不能及时编制出来造成的。由此可见,编程的自动化是当今制造业的一个必然的发展趋势。所谓的自动编程,就是利用计算机专用软件来编制数控加工程序,编程人员只需根据零件图样的要求,使用数控语言,由计算机自动地进行数值计算及后置处理,编写出零件加工程序单。在很多制造领域,尤其在军事工业,航空航天工业,微观制造业等尖端科技领域,由于其产品往往具有科技含量高、结构复杂、精度高等特点,给手工编程造成了很大难度,甚至无法完成。为了缩短编程时间,减少人为失误,编程后方便加工前的加工模拟,越来越多的常规制造领域业逐渐采用自动编程。因此,制造业界投入了越来越多的资源来进行自动编程技术的研究开发,使其迅速的发展成熟起来。本次课程设计的目的就是设计一个可以将AutoCAD等计算机辅助设计软件画出的DXF图形文件中的相关信息提取出,通过编程转换成我们所需要的加工图形,并生成数控代码,实现自动编程目的软件。2前期准备2.1编程软件的选择VisualBasic(VB)和VisualC++(VC)虽然都是可视化的高级编程语言,但是编写相同程序时,VC的工作量一般要比VB高上很多,而且VC适用于大型的,复杂的,商用的程序,其学习难度也远高与VB。VB是一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发Windows环境下的各类应用程序。它简单、效率高,且功能强大。故选用用VisualBasic作为本次课程设计的编程软件。2.2DXF文件的结构1、DXF文件简介DXF是DrawingExchangeFormat的缩写,是Autodesk公司开发的用于AutoCAD与其它软件之间进行CAD数据交换的CAD数据文件格式。其扩展名是“.dxf”,是一种基于矢量的ASCII格式,在表现图形的大小方面十分精确,由于它结构简单、可读性好,易于被其他程序处理,因此已是事实上的工业标准。目前,绝大多数CAD系统都能读入或输出DXF文件。2、DXF文件的组成一个完整的DXF文件由六大段组成,分别是:标题段(HEADERSection)类段(CLASSEDSection)表段(TABLESSection)块段(BLOCKSSection)实体段(ENTITLESSection)对象段(OBJECTSSection)还有起始段和段终止标记以及文件结束标记。一般情况下,段的前后顺序不能改变。六大段中与几何图形有关的几何信息均包含在实体段中,实体段中的实体有:点,直线,圆,圆弧,折线,B样条曲线,文本等。而我们只需要用到直线和圆弧。不同实体在DXF文件中的记录要素不同,例如一条直线的几何信息是直线的起点和终点坐标。通过分析DXF的文件结构和自动编程所需的信息,只掌握ENTITLES段就基本可以满足绘图和提取几何图形基本信息的要求。3、实体段(ENTITLESSection)该段定义了每个实体的种类,所在的图层名,颜色,线形,厚度,实体描述字及有关几何数据,如直线(起点、终点),圆(层、圆心、半径),圆弧(圆心、角度、起始坐标、终点坐标)。无论DXF中的哪一个段均由若干个组(Group)组成,每个组单元占两行,第一行为组码(GroupCodes),为整形的代码,代表着改组组值的性质,第二行为组值(GroupValue),为具体的数值和代码,两者相结合标识出具体组值代表的意义。表1至表3是DXF直线、圆、圆弧组码的功能说明表一:DXF中直线组码的说明组码说明100子类标记(AcDbLine)6线形(可选)10起点(在OCS中)DXF:X的值20,30DXF中Y,Z起点(在OCS中)的值11端点(OWCS中)DXF:X的值21,31DXF中Y,Z端点(在OCS中)的值表二:DXF中圆的组码的说明组码说明100子类标记(AcDbCircle)6线形(可选)10中心点(在OCS中)DXF:X的值20,30DXF中Y,Z中心点(在OCS中)的值40半径210拉伸方向。默认值(0,0,1),DXF:X值220,230Y,Z的拉伸方向表三:DXF中圆弧组码的说明组码说明100子类标记(AcDbCircle)6线形(可选)10中心点(在OCS中)DXF:X的值20,30DXF中Y,Z中心点(在OCS中)的值40半径100子类标记(AcDbArc)50起始角度51终点角度210拉伸方向。默认值(0,0,1),DXF:X值220,230Y,Z的拉伸方向由表可知,AcDbArc嵌套在AcDbCircl中,并且圆心、半径的组码与圆的都相同。但是圆与圆弧的提取并不会混淆,因为在ENTITLES段中每个实体定义的入口处组码0的组值标示着实体类型,圆在入口处组码的组值是CIRCLE,而圆弧是ARC,由此可区分提取。DXF文件中的组码50,51给出的是圆弧起点与终点角度,而对于运动控制信息而言,需要的是圆弧起点与终点的坐标值。根据下式,将得到的是圆弧的所在坐标系下的两个端点的坐标值。设圆心坐标为(X,Y),半径为R,起始角为a,终止角为b,则可得到圆弧在所在坐标系下的起点坐标(X1,X三、数控系统软件设计过程数控系统软件的设计是本次课程设计的主要内容与核心部件,通过VisualBasic的编程功能,我们从DXF文件中提取出所需的组码,并利用这些组码显示图形,生成数控代码。我们还考虑了刀补,加工方向以及起刀点的选择。为了方便使用者操作,我们把这些功能通过人性化的界面表达,用户只用进行一些简单的操作,便可实现自动编程的功能。为了能够清晰显示图像,界面包含原始状态、最大化两种情况。图1虚线框内是整个软件的功能的设计流程。其中,我和另外两名同学需要做的是从读入DXF文件,提取圆弧和直线信息并排序,最后显示图形(1-4步)。而我又在其中负责显示图形(第4步)工作。图1数控系统软件设计的流程图3.1读入DXF文件使用VB中的通用对话框控件,可以打开所需的DXF源文件,并按行读取文件中的数据内容,具体程序如下:PrivateSubopenfile_Click()CallopenDXFfile_ClickEndSubPrivateSubopenDXFfile_Click()'打开文件TDXF=""CommonDialog1.filename=""CommonDialog1.ShowOpen'打开文件filename=CommonDialog1.filenameOnErrorGoTocancleopenj=0OpenfilenameForInputAs#1'按行读取打开的文件顺序读取数据的内容DoWhileNotEOF(1)LineInput#1,saveDXFIfsaveDXF="AcDbCircle"OrsaveDXF="AcDbLine"Thenj=j+1EndIfTDXF=TDXF&saveDXF&"~"'保存文件信息Loopk=jReDimDXFline(1Tok),DXFcircle(1Tok),TEMPline(1Tok),TEMPcircle(1Tok),Common(1Tok),D(1Tok),TempCommon(1Tok),Taxis(1Tok)Close#1此程序可由openDXFfile子程序打开DXF文件并找出实体段中圆弧与直线的组码,并计数。3.2提取相关圆弧和直线的信息由于刚才程序中,在圆弧和直线组码开始处追加了“~”,方便了下面提取每段圆弧与直线信息的程序查找所需内容。strStart1=InStr(1,TDXF,"AcDbLine"&"~")'提取直线标志所在行strStart2=InStr(1,TDXF,"AcDbCircle"&"~")'提取圆弧标志所在行IfstrStart1>strStart2AndstrStart2<>0ThenstrStart=strStart2ElseIfstrStart1<>0ThenstrStart=strStart1ElsestrStart=strStart2EndIfstrEnd=InStr(strStart,TDXF,"ENDSEC"&"~")'提取直线和圆弧终点的几何信息temp=Mid(TDXF,strStart,strEnd-strStart)'提取直线和圆弧的几何信息sourse=Split(temp,"~")startPos=-1j=0DoWhilestartPos<>-2'提取直线和圆弧的几何信息startPos=getStart(startPos)IfstartPos=-2ThenExitDoIfsourse(startPos)="AcDbLine"Thenj=j+1DXFline(j).SX=0DXFline(j).SY=0DXFline(j).EX=0DXFline(j).EY=0DXFline(j).SX=sourse(startPos+2)'拾取起点的X坐标DXFline(j).SY=sourse(startPos+4)'拾取起点的Y坐标DXFline(j).EX=sourse(startPos+8)'拾取终点的X坐标DXFline(j).EY=sourse(startPos+10)'拾取终点的Y坐标DXFline(j).Flag=TrueCommon(j).SX=DXFline(j).SXCommon(j).SY=DXFline(j).SYCommon(j).EX=DXFline(j).EXCommon(j).EY=DXFline(j).EYCommon(j).R=0Common(j).Flag=True'直线的标记Elsej=j+1DXFcircle(j).R=0DXFcircle(j).OX=0DXFcircle(j).OY=0DXFcircle(j).Sangle=0DXFcircle(j).Eangle=0DXFcircle(j).OX=sourse(startPos+2)'拾取圆心的X坐标DXFcircle(j).OY=sourse(startPos+4)'拾取圆心的Y坐标DXFcircle(j).R=sourse(startPos+8)拾取圆弧半径DXFcircle(j).Sangle=sourse(startPos+12)*PI/180'拾取圆弧起始角DXFcircle(j).Eangle=sourse(startPos+14)*PI/180'拾取圆弧终止角DXFline(j).Flag=FalseCommon(j).SX=DXFcircle(j).R*Cos(DXFcircle(j).Sangle)+DXFcircle(j).OX'计算圆弧的起始点X坐标Common(j).SY=DXFcircle(j).R*Sin(DXFcircle(j).Sangle)+DXFcircle(j).OY'计算圆弧的起始点Y坐标Common(j).EX=DXFcircle(j).R*Cos(DXFcircle(j).Eangle)+DXFcircle(j).OX'计算圆弧的终止点X坐标Common(j).EY=DXFcircle(j).R*Sin(DXFcircle(j).Eangle)+DXFcircle(j).OY'计算圆弧的终止点Y坐标Common(j).R=DXFcircle(j).RCommon(j).Flag=False'圆弧的标记Common(j).OX=DXFcircle(j).OXCommon(j).OY=DXFcircle(j).OYCommon(j).Sangle=DXFcircle(j).SangleCommon(j).Eangle=DXFcircle(j).EangleEndIfLoop通过上面的程序,我们首先把第一个出现的圆弧或直线组码信息放入strStart中,再通过Instr()、Mid()函数找出此段信息的终点与长度。通过设置Startpos标志,我们逐步找到直线或圆弧组码中相对于的起点坐标和终点坐标(圆弧的坐标需要根据之前给出的公式计算)。其中,我们还建立了一个模块“Module1”,定义了以上程序中用到的函数和变量。PublicTypeA_type'用于保存圆弧元素OXAsDoubleOYAsDoubleSangleAsDoubleEangleAsDoubleRAsDoubleMarkAsBooleanEndTypePublicTypeB_type'用于保存直线元素SXAsDoubleSYAsDoubleEXAsDoubleEYAsDoubleFlagAsBooleanEndTypePublicTypeC_type'用于保存圆弧和直线元素,方便CNC代码的生成SXAsDoubleSYAsDoubleEXAsDoubleEYAsDoubleRAsDoubleFlagAsBooleanMarkAsBooleanOXAsDoubleOYAsDoubleSangleAsDoubleEangleAsDoubleEndTypePublicDXFline()AsB_type,DXFcircle()AsA_type,Common()AsC_type,TempCommon()AsC_type,Taxis()AsC_typePublicTCNCAsString,TDXFAsStringPublicScaleMaxAsDouble,ScaleMinAsDouble,ScaleOAsDouble3.3排序通过上面的步骤,我们已经提取出了DXF文件中的直线与圆弧组码,为了进一步的处理,需要对绘图时的直线与圆弧信息按照加工顺序重新排序。首先,对圆弧是逆时针加工(G03)顺时针加工(G02)进行区分。AutoCAD中的圆弧都是由逆时针方向生成的,刚才我们已经得到了圆弧的起点,如果在圆弧之前的那个图形的终点坐标与圆弧的起点坐标重合(差值<0.001),那么此圆弧是逆时针的,若之前图形的终点与圆弧终点重合(差值<0.001),圆弧是顺时针的。在判断的过程中,设置了双层循环,不停的比较图形之间的关系,寻找重合的终点和起点,把相邻的图形坐标按顺序排好。最后Taxis(i)中就保存了整个图形的起点终点坐标,完成了要求的排序,为生成数控代码做准备。Fori=1Tok-1'预排序和初步判断G02、G03Fors=i+1TokIfAbs(Common(i).EX-Common(s).SX)<0.001AndAbs(Common(i).EY-Common(s).SY)<0.001ThenCommon(s).Mark=False'G03的标记D(i)=Common(i+1)Common(i+1)=Common(s)Common(s)=D(i)ElseIfAbs(Common(i).EX-Common(s).EX)<0.001AndAbs(Common(i).EY-Common(s).EY<0.001)ThenCommon(s).Mark=True'G02的标记D(i).SX=Common(s).SXD(i).SY=Common(s).SYCommon(s).SX=Common(s).EXCommon(s).SY=Common(s).EYCommon(s).EX=D(i).SXCommon(s).EY=D(i).SYD(i)=Common(i+1)Common(i+1)=Common(s)Common(s)=D(i)EndIfNextsNextiIfAbs(Common(k).EX-Common(1).SX)>0.001AndAbs(Common(k).EY-Common(1).SY)>0.001ThenMsgBox"您提供的图形不封闭,无法进行后续加工!",,"错误提示"GetNCcode.Enabled=FalseClearCode.Enabled=FalseSaveNCcode.Enabled=FalseExitSubEndIfFori=1Tok'把预排序的结果记录下来,为NC代码生成做准备Taxis(i)=Common(i)Next最后几行程序用于检查提供的图形DXF文件是否封闭,若不封闭,提示错误,并关闭“生成代码”、“清除文件”、“保存程序”几个按钮3.4显示图形因为画图时首先要确定画图的区域,因此首先找出所有图形元素的起点和终点坐标中的最大值与最小值。Xmax=Max(Common(1).SX,Common(2).SX)Ymax=Max(Common(1).SY,Common(2).SY)Xmin=Min(Common(1).SX,Common(2).SX)Ymin=Min(Common(1).SY,Common(2).SY)Fori=3TojXmax=Max(Xmax,Common(i).SX)Ymax=Max(Ymax,Common(i).SY)Xmin=Min(Xmin,Common(i).SX)Ymin=Min(Ymin,Common(i).SY)Next在生成图像时,需要分两种情况,一个是原始状态的窗口,还有一个是最大化的窗口,分别用WindowState=0和WindowState=2来标识。原始状态在原来的基础上加50,最大化加900。同时,画图函数也用redraw1与redraw(扩大1.5倍)分别绘制两种情况下的图形。Fori=1Tok'画图IfForm2.WindowState=0ThenScaleMax=Max(Abs(Max(Xmax,Ymax)),Abs(Min(Xmin,Ymin)))+50PicDXF.Scale(0,ScaleMax)-(ScaleMax,0)'调整图形使得能在图形框看到图形全貌redraw1ElseIfForm2.WindowState=2ThenScaleMax=Max(Abs(Max(Xmax,Ymax)),Abs(Min(Xmin,Ymin)))+900PicDXF.Scale(0,ScaleMax)-(ScaleMax,0)'调整图形使得能在图形框看到图形全貌redrawEndIfNext***************下面为画图所用的通用过程或者函数*****************Subredraw()Fori=1Tok'画图IfTaxis(i).Flag=TrueThenPicDXF.Line(CDbl(Taxis(i).SX*1.5),CDbl(Taxis(i).SY*1.5))-(CDbl(Taxis(i).EX*1.5),CDbl(Taxis(i).EY*1.5))ElsePicDXF.Circle(CDbl(Taxis(i).OX*1.5),CDbl(Taxis(i).OY*1.5)),CDbl(Taxis(i).R)*1.5,,CDbl(Taxis(i).Sangle),CDbl(Taxis(i).Eangle)EndIfNextEndSubSubredraw1()Fori=1Tok'画图IfTaxis(i).Flag=TrueThenPicDXF.Line(CDbl(Taxis(i).SX),CDbl(Taxis(i).SY))-(CDbl(Taxis(i).EX),CDbl(Taxis(i).EY))ElsePicDXF.Circle(CDbl(Taxis(i).OX),CDbl(Taxis(i).OY)),CDbl(Taxis(i).R),,CDbl(Taxis(i).Sangle),CDbl(Taxis(i).Eangle)EndIfNextEndSubFunctionMax(l,m)'调整图形用Ifl>=mThenMax=lElseMax=mEndIfEndFunctionFunctionMin(l,m)'调整图形用Ifl<=mThenMin=lElseMin=mEndIfEndFunctionPrivateSubPicDXF_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1Thenbx=Xby=YStartmove=TrueEndIfEndSubSubPicDXF_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfCommonDialog1.filename<>""ThenForm2.Caption="图形转CNC代码数控系统--("&X&","&Y&")"EndIfIfStartmoveThenPicDXF.ScaleTop=PicDXF.ScaleTop+(by-Y)PicDXF.ScaleLeft=PicDXF.ScaleLeft+(bx-X)PicDXF.ClsEndIfIfForm2.WindowState=0AndText1.Text<>""Thenredraw1ElseIfForm2.WindowState=2AndText1.Text<>""ThenredrawEndIfEndSubPrivateSubPicDXF_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1ThenStartmove=FalseEndSub画图过程中用到的子程序与函数在程序的后部定义。需要特别说明的是调整图形位置的几段子程序。当对已生成的图形执行Mousedown事件,把此时的坐标值赋给变量bx、by,并把True赋给Startmove。在Mousemove事件中,通过移动后的坐标与bx,by相比较,再加上原有图像位置的最大值,便可把图像移到新的位置,并把鼠标的时事位置显示在“即时坐标”中。在Mouseup事件中,把False赋给Startmove,完成移动。下图是生成图形和移动图形的样例。图2WindowState=0时生成图形与移动图形图3WindowState=2时生成图形与移动图形除了可以生成直线的图形,还可生成圆弧、以及直线与圆弧的合成图形。如图4、图5所示。图4生成圆弧图形图5直线和圆弧合成图形之所以要设置移动这个功能,是因为生成图形的第一步确定画图区域时,有一个难题。因为判断最大、最小范围是通过图像的起点和终点坐标来决定的,关于圆弧,我们并没有考虑到半径的问题。如果遇到类似与图6中的情况,有可能会超出图像显示区域的范围。虽然可以把圆弧改为一段一段的折线来逼近,再判断折现的起终点,但是毕竟对此次课程设计来说,实现这项功能有些困难,为此相出了图形可以移动的办法,来弥补这一缺憾。不过这也是我们设计的一个亮点。图6超出图形显示区域范围举例最后提取排好序的Common数组中已存的线的起点或终点信息,显示于对刀点显示区。同时,各种功能按钮及参数选择按钮处于激活状态。Fori=1Tok'显示DXF文件的的起刀点List2.AddItem(i&":"&Format(Common(i).SX,"#0.00")&","&Format(Common(i).SY,"#0.00"))NextGetNCcode.Enabled=TrueOptionij.Enabled=TrueClearCode.Enabled=TrueOptionk.Enabled=TrueOptG41.Enabled=TrueOptG42.Enabled=TrueMaintaxisM03.Enabled=TrueMaintaxisM04.Enabled=TrueOptionij.Value=TrueOptG41.Value=TrueMaintaxisM03.Value=TrueText1.Text="1"ExitSubcancleopen:EndSub3.5生成数控代码1、准备工作先在NC代码显示区处清零,重新载入预排序的元素信息。判断各个参数是否已经设置,若存在未设置的参数,提示出错,若参数均已设置好,则相关功能按钮激活。选择起刀点后,软件按选择的起刀点及加工方向确定的直线段或圆弧信息出现的先后顺序,选取两者中首先出现的图形的起点作为加工起点,并开始加工第一段和生成相应的NC代码。2、判断图形是顺时针还是逆时针预排序后,生成的图形路径,有可能是顺时针的,也有可能是逆时针的,还要考虑G41、G42的选择在这里引入countclock()函数,用以判断预排序是顺时针的还是逆时针的。3、最终排序若为逆时针生成图形的,先判断选择G42还是G41刀补。若为G42,走刀为逆时针方向,与预排序方向一致。再根据选择的起刀点,对Common(k)数组再次排序,将以用户选择的直线或圆弧的起点作为第一条加工的线,以此类推。若为G41,则走刀与预排序方向相反。再根据选择的起刀点,将各个直线和圆弧的起点和终点交换,对Common(k)数组再次排序,将以用户选择的对刀点作为起点的直线或圆弧作为第一条加工的线,以此类推,最终以顺时针走刀。若为顺时针生成图形的,与上面所述的情形相反。4、生成连续的数控代码将相关输出信息存于textcode中。第一行为输出G92指令,程序如下:textcode="G92X"&TxtX.Text&"Y"&TxtY.Text&"Z"&TxtZ.Text&"LF"&vbCrLf输出一段G92指令后,判断刀补选择方式及主轴转向等信息,针对不同的用户选择,输出相应的加工代码,以下是采用G42刀补及采用M03转向的程序:textcode=textcode&"N01G90G17G00"&"G42D01"&"X"&Format(Common(1).SX,"#0.00")&"Y"&Format(Common(1).SY,"#0.00")&"S"&Text2.Text&"M03"&"LF"&vbCrLf其他情况类推。接下来判断将要画的第一条线是否直线,判断为正时输出G01加工指令,指令如下:IfCommon(1).Flag=TrueThentextcode=textcode&"N02G01X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"F"&TextF.Text&""&Text3.Text&"LF"&vbCrLf若为圆弧,则需继续判断G02或G03的标记、判断圆弧表示方法,采用相应的加工代码,指令如下:ElseIfCommon(1).Flag=FalseThen'判断为圆弧的标记,使用G02/G03IfCommon(1).Mark=TrueThen'G02的标记IfOptionij=TrueThentextcode=textcode&"N02G02X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"I"&Format(Common(1).SX,"#0.00")&"J"&Format(Common(1).SY,"#0.00")&"F"&TextF.Text&""&Text3.Text&"LF"&vbCrLfElseIfOptionk=TrueThentextcode=textcode&"N02"&"G02X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"R"&Format(Common(1).R,"#0.00")&"F"&TextF.Text&""&Text3.Text&"LF"&vbCrLfEndIfElse'G02的标记IfOptionij=TrueThentextcode=textcode&"N02G03X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"I"&Format(Common(1).SX-Common(1).OX,"#0.00")&"J"&Format(Common(1).SY-Common(1).OY,"#0.00")&"F"&TextF.Text&""&Text3.Text&"LF"&vbCrLfElseIfOptionk=TrueThentextcode=textcode&"N02"&"G03X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"R"&Format(Common(1).R,"#0.00")&"F"&TextF.Text&Text3.Text&"LF"&vbCrLfEndIfEndIfEndIf用循环语句输出指令。参照第一条线的输出程序,从i=2开始用循环判断方式输出指令,程序如下:Fori=2TokIfCommon(i).Flag=TrueThen'判断为直线的标记,使用G01textcode=textcode&"N"&Format(i+1,"00")&"G01X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"LF"&vbCrLfElseIfCommon(i).Flag=FalseThen'判断为圆弧的标记,使用G02/G03IfCommon(i).Mark=TrueThen'G02的标记IfOptionk=TrueThentextcode=textcode&"N"&Format(i+1,"00")&"G02X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"R"&Format(Common(i).R,"#0.00")&"LF"&vbCrLfElseIfOptionij=TrueThentextcode=textcode&"N"&Format(i+1,"00")&"G02X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"I"&Format(Common(i).SX-Common(i).OX,"#0.00")&"J"&Format(Common(i).SY-Common(i).OY,"#0.00")&"LF"&vbCrLfEndIfElse'G03的标记IfOptionk=TrueThentextcode=textcode&"N"&Format(i+1,"00")&"G03X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"R"&Format(Common(i).R,"#0.00")&"LF"&vbCrLfElseIfOptionij=TrueThentextcode=textcode&"N"&Format(i+1,"00")&"G03X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"I"&Format(Common(i).SX-Common(i).OX,"#0.00")&"J"&Format(Common(i).SY-Common(i).OY,"#0.00")&"LF"&vbCrLfEndIfEndIfEndIfNexti最终将textcode中的内容加上最后一行结束代码,显示在CNC代码显示区中。3.6辅助功能在3.4中我们已经叙述了windowstate实现原始窗口与最大化窗口的转化功能,以下是windowstate改变时控件跟随改变的代码:PublicSubResizeInit(FormNameAsForm)DimpCtlAsControl’设置窗体旧的高度与宽度Form2dWidth=FormName.ScaleWidthForm2dHeight=FormName.ScaleHeightOnErrorResumeNextForEachpCtlInFormName'设置窗体中控件的Tag值(根据空间的位置和大小来设置)'返回或设置一个表达式,它存储程序需要的额外数据。'与其它属性不同,VisualBasic不使用Tag属性的'可用该属性识别对象。pCtl.Tag=pCtl.left&""&pCtl.top&""&pCtl.Width&""&pCtl.Height&""NextpCtlOnErrorGoTo0EndSubPublicSubResizeForm(FormNameAsForm)DimPos(4)AsDoubleDimiAsLong,tmpPosAsLong,staPosAsLongDimpCtlAsControlDimScaleXAsDouble,ScaleYAsDouble'保存窗体的宽度与高度缩放比例ScaleX=FormName.ScaleWidth/Form2dWidthScaleY=FormName.ScaleHeight/Form2dHeightOnErrorResumeNext'变化窗体内的各控件ForEachpCtlInFormNamestaPos=1Fori=0To4'位置和大小'取得控件的原始位置和大小tmpPos=InStr(staPos,pCtl.Tag,"",vbTextCompare)IftmpPos>0ThenPos(i)=Mid(pCtl.Tag,staPos,tmpPos-staPos)staPos=tmpPos+1ElsePos(i)=0EndIf'根据控件的原始位置及窗体改变大小的'比例对控件重新定位与改变大小pCtl.MovePos(0)*ScaleX,Pos(1)*ScaleY,Pos(2)*ScaleX,Pos(3)*ScaleYNextiNextpCtlOnErrorGoTo0EndSub'在窗体启动时,调用ResizeInit函数'以记录窗体中各控件的大小和位置'窗体大小发生变化时,根据窗体改变大小的比例'对窗体中各控件重新定位和改变大小。PrivateSubForm_Resize()CallResizeForm(Me)IfForm2.WindowState=0ThenPicDXF.Height=4500PicDXF.Width=4500redraw1ElseIfForm2.WindowState=2ThenPicDXF.Height=6000PicDXF.Width=6000TextNC.Width=5700Frame10.Width=6050redrawEndIfEndSubPrivateSubtxtcls_Click()CallClearCode_ClickEndSub4软件使用说明4.1欢迎界面单击如图7所示的程序图标,图7程序图标将会得到如图8所示的界面。因为人性化设计是我们考虑的一个重要因素,为了给用户一个视觉上的亲切感,我们设计了欢迎界面。在欢迎界面上有两个按钮,分别是“进入系统”和“退出”。单击“退出”将会直接结束本程序,若单击“进入系统”将会得到如图9所示的程序主界面。图8欢迎界面4.2程序主界面程序主界面主要由以下几部分组成:按键:“打开文件”、“生成代码”、“保存代码”、“清除文件”“退出”“关于”。单选按钮:可供用户选择“主轴转向”、“圆弧表达方式”以及“刀补方式”。组合框供用户选择“对刀点”,(还可在“起点坐标”自定义)进给速度默认值是100mm/min.。“图形显示区”用来显示从DXF文件中读取的组码所描述的图形。并且“即时坐标”随鼠标在“图形显示区”移动而改变。而“CNC代码显示区”显示的是最终的数控代码。图9程序主界面4.3功能演示1、单击“打开文件”,可得到如图10所示的对话框:图10打开DXF文件2、选择合适文件的文件后,单击“打开”,便可在“DXF图形显示区”得到图形,并在程序界面“参数设置”设置好适当的参数,再按“代码生成”可以在“代码窗口”得到NC程序代码如图11所示。图11生成代码3、点击“保存代码”按钮,可以把刚才生成的数控代码以txt文件的形式保存。如图12、13所示。图12保存代码图13生成.txt文件4、其它辅助功能如“关闭退出”,“图片清除”,可以按相应的按钮得到。图14退出程序5设计总结三周的课程设计完成了,在这个过程中,我们又掌握了一种高级编程语言VisualBasic,加深了对AutoCAD中的DXF文件中组码的了解,设计了从图形到数控代码的算法,并完成了软件界面的设计。通过课程设计,我学到了如何用VB编写我们需要的程序,也对数控技术这门课程学习的内容印象更深了。学了三年机械专业的理论知识,我总想知道我们学的理论在走入工作岗位上怎样应用,其实课程设计就把理论和实际联合在了一起。只有这样亲手设计、亲自操作,才能把理论知识转化为实际应用,服务机械行业。通过学习VB并和之前所学的C语言对比,明白了它们的区别和联系。VB使用的编程方式是可视化的,也就是能通过对象窗口时事观看编程所产生的影响。而VB中的指令和代码相比C语言也更加灵活。但是C语言也有它的特点,比如更倾向与硬件,编程的逻辑性也更强。虽然学习使用AutoCAD是从大一开始的,但平时接触的多是基本的二维绘图功能。DXF更像是AutoCAD的后台程序,通过最基本的组码,标识各种图形参数。这使我们了解了平常使用不到的功能。算法是编程的灵魂,其实在本次课程设计考察我们最多的还是算法的设计。不管是软件界面的设计、提取代码、排序、生成图形、刀补选择、加工起点选择直到最后得出我们需要的数控代码,这中间的每一个步骤都离不开高效,可行的算法。这里也凝聚了我们小组的最多心血。这个程序的算法也是我们课程设计的亮点所在,不管是最大化窗口还是移动图形,以及G41、G42刀补的选择、顺逆时针的判定,都是我们做的比较优秀的地方,也是花费努力最多的地方。但是能够实现这些功能,我们也感到十分的欣慰。最后要感谢陪伴我们大三整个学年学习的刘建群老师,也是在您的悉心教导下,我们对控制论、数控技术、编程开发等方面的知识从不懂到熟悉,再到应用。谢谢老师!参考文献[1]廖效果,刘又午,朱剑英.数控技术[M].武汉:湖北科学技术出版社,2000.[2]孟祥瑞.VisualBasic6.0程序设计[M].上海:华东理工大学出版社,2005.[3]匡松.VisualBasic程序设计24学时轻松掌握[M].北京:中国铁道出版社,2007.7附录以下是这次设计全部程序:Form1:PrivateSubForm_Load()Form1.Icon=LoadPicture(App.Path&"\素材图片\grfwnd.ico")EndSubPrivateSubPicture1_Click()Form2.ShowUnloadMeEndSubPrivateSubPicture2_Click()OnErrorResumeNextIfMsgBox("确定要退出软件吗?",32OrvbYesNo,"退出确认")=vbYesThenUnloadMeUnloadForm1EndIfEndSubPrivateSubPicture1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)DimaaAsIntegeraa=Picture1.leftIf(X>Picture1.left-800AndX<aa+Picture1.Width)ThenPicture1.Picture=LoadPicture(App.Path&"\素材图片\进入系统2.jpg")EndIfEndSubPrivateSubPicture2_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)DimbbAsIntegerbb=Picture1.leftIf(X>Picture2.left-500AndX<bb+Picture2.Width-200)ThenPicture2.Picture=LoadPicture(App.Path&"\素材图片\退出2.jpg")Timer1.Enabled=TrueEndIfEndSubPrivateSubTimer1_Timer()Picture2.Picture=LoadPicture(App.Path&"\素材图片\退出1.jpg")EndSubForm2:OptionExplicitConstPIAsDouble=3.1415926'定义变量DimiAsInteger,jAsInteger,sAsIntegerDimXmaxAsDouble,XminAsDouble,YmaxAsDouble,YminAsDouble,D()AsC_typeDimFileNameAsString,saveDXFAsString,n()AsString,tempAsString,textcodeAsStringDimstrStart,strStart1,strStart2AsIntegerDimstrEndAsIntegerDimstartPosAsIntegerDimsourseAsVariant,sHeightAsDouble,kAsInteger,lAsInteger,mAsIntegerDimForm2dWidthAsLong'窗体旧的宽度值DimForm2dHeightAsLong'窗体旧的高度值Dimbx,byAsLong,X1AsSingle,Y1AsSingleDimStartmoveAsBoolean'定义各个全局变量DimoAsIntegerDimpAsIntegerDimyuanAsDoubleDimkmAsDoubleDimzsAsIntegerFunctioncountclock()AsBoolean'判断DXF画图方向zs=0'判断是否全部是圆弧,若是定义countclock=falseForp=1TokIfCommon(p).Flag=TrueThenzs=1EndIfNextpIfzs=0Thencountclock=FalseExitFunctionEndIf'下面判断画图时封闭曲线的走向Forp=1TokIfCommon(p).SY=YminAndCommon(p).EY=YminAndCommon(p).Flag=TrueThenIfCommon(p).SX>=Common(p).EX=YminThencountclock=TrueElsecountclock=FalseEndIfExitFunctionElseIfCommon(p).EY=YminTheno=pEndIfNextyuan=Atn((Common(o).EY-Common(o).SY)/(Common(o).EX-Common(o).SX))Ifo<>kThenkm=Atn((Common(o+1).EY-Common(o+1).SY)/(Common(o+1).EX-Common(o+1).SX))Elsekm=Atn((Common(1).EY-Common(1).SY)/(Common(1).EX-Common(1).SX))EndIfIfyuan<0Thenyuan=yuan+PIEndIfIfkm<0Thenkm=yuan+PIEndIfIfkm<yuanThencountclock=FalseElsecountclock=TrueEndIfEndFunctionPrivateSubabout_Click()'点击about调出form3Form3.ShowEndSubPrivateSubopenfile_Click()CallopenDXFfile_ClickEndSubPrivateSubout_Click()CallQuit_ClickEndSubPrivateSubpiccls_Click()PicDXF.ClsEndSubPrivateSubsavefile_Click()CallSaveNCcode_ClickEndSubPrivateSubQuit_Click()OnErrorResumeNextIfMsgBox("确定要退出软件吗?",32OrvbYesNo,"退出确认")=vbYesThenUnloadMeUnloadForm2EndIfEndSubPrivateSubcode_Click()CallGetNCcode_ClickEndSubPrivateSubForm_Load()Form2.Icon=LoadPicture(App.Path&"\素材图片\grfwnd.ico")CallResizeInit(Me)openDXFfile.Enabled=TrueOptionij.Enabled=FalseOptionk.Enabled=FalseOptG41.Enabled=FalseOptG42.Enabled=FalseMaintaxisM03.Enabled=FalseMaintaxisM04.Enabled=FalseDimFileNameAsStringEndSubFunctiongetStart(mAsInteger)AsInteger'找出所需几何信息的起始点DimnAsIntegerm=m+1Forn=mToUBound(sourse)Ifsourse(n)="AcDbLine"Orsourse(n)="AcDbCircle"ThengetStart=nExitFunctionEndIfNextgetStart=-32EndFunction'************************以下部分是打开DXF文件,并生成代码程序******************PrivateSubopenDXFfile_Click()'打开文件TDXF=""CommonDialog1.Filter="AllFiles(*.dxf)|*.dxf"CommonDialog1.FileName=""CommonDialog1.ShowOpen'打开文件DimiAsIntegerDimtAsStringIfCommonDialog1.FileName<>""Theni=InStrRev(CommonDialog1.FileName,"\")t=right(CommonDialog1.FileName,Len(CommonDialog1.FileName)-i)Form2.Caption="图形转CNC代码数控系统--("&t&")"EndIfFileName=CommonDialog1.FileNameOnErrorGoTocancleopenj=0OpenFileNameForInputAs#1'按行读取打开的文件顺序读取数据的内容DoWhileNotEOF(1)LineInput#1,saveDXFIfsaveDXF="AcDbCircle"OrsaveDXF="AcDbLine"Thenj=j+1EndIfTDXF=TDXF&saveDXF&"~"'保存文件信息Loopk=jReDimDXFline(1Tok),DXFcircle(1Tok),Common(1Tok),D(1Tok),TempCommon(1Tok),Taxis(1Tok)Close#1strStart1=InStr(1,TDXF,"AcDbLine"&"~")'提取直线标志所在行strStart2=InStr(1,TDXF,"AcDbCircle"&"~")'提取圆弧标志所在行IfstrStart1>strStart2AndstrStart2<>0ThenstrStart=strStart2ElseIfstrStart1<>0ThenstrStart=strStart1ElsestrStart=strStart2EndIfstrEnd=InStr(strStart,TDXF,"ENDSEC"&"~")'提取直线和圆弧终点的几何信息temp=Mid(TDXF,strStart,strEnd-strStart)'提取直线和圆弧的几何信息sourse=Split(temp,"~")startPos=-1j=0DoWhilestartPos<>-32'提取直线和圆弧的几何信息startPos=getStart(startPos)IfstartPos=-32ThenExitDoIfsourse(startPos)="AcDbLine"Thenj=j+1DXFline(j).SX=0DXFline(j).SY=0DXFline(j).EX=0DXFline(j).EY=0DXFline(j).SX=sourse(startPos+2)'拾取起点的X坐标DXFline(j).SY=sourse(startPos+4)'拾取起点的Y坐标DXFline(j).EX=sourse(startPos+8)'拾取终点的X坐标DXFline(j).EY=sourse(startPos+10)'拾取终点的Y坐标DXFline(j).Flag=TrueCommon(j).SX=DXFline(j).SXCommon(j).SY=DXFline(j).SYCommon(j).EX=DXFline(j).EXCommon(j).EY=DXFline(j).EYCommon(j).R=0Common(j).Flag=True'直线的标记Elsej=j+1DXFcircle(j).R=0DXFcircle(j).OX=0DXFcircle(j).OY=0DXFcircle(j).Sangle=0DXFcircle(j).Eangle=0DXFcircle(j).OX=sourse(startPos+2)'拾取圆心的X坐标DXFcircle(j).OY=sourse(startPos+4)'拾取圆心的Y坐标DXFcircle(j).R=sourse(startPos+8)'拾取圆弧半径DXFcircle(j).Sangle=sourse(startPos+12)*PI/180'拾取圆弧起始角DXFcircle(j).Eangle=sourse(startPos+14)*PI/180'拾取圆弧终止角DXFline(j).Flag=FalseCommon(j).SX=DXFcircle(j).R*Cos(DXFcircle(j).Sangle)+DXFcircle(j).OX'计算圆弧的起始点X坐标Common(j).SY=DXFcircle(j).R*Sin(DXFcircle(j).Sangle)+DXFcircle(j).OY'计算圆弧的起始点Y坐标Common(j).EX=DXFcircle(j).R*Cos(DXFcircle(j).Eangle)+DXFcircle(j).OX'计算圆弧的终止点X坐标Common(j).EY=DXFcircle(j).R*Sin(DXFcircle(j).Eangle)+DXFcircle(j).OY'计算圆弧的终止点Y坐标Common(j).R=DXFcircle(j).RCommon(j).Flag=False'圆弧的标记Common(j).OX=DXFcircle(j).OXCommon(j).OY=DXFcircle(j).OYCommon(j).Sangle=DXFcircle(j).SangleCommon(j).Eangle=DXFcircle(j).EangleEndIfLoopFori=1Tok-1'预排序和初步判断G02、G03Fors=i+1TokIfAbs(Common(i).EX-Common(s).SX)<0.001AndAbs(Common(i).EY-Common(s).SY)<0.001ThenCommon(s).Mark=False'G03的标记D(i)=Common(i+1)Common(i+1)=Common(s)Common(s)=D(i)ElseIfAbs(Common(i).EX-Common(s).EX)<0.001AndAbs(Common(i).EY-Common(s).EY)<0.001ThenCommon(s).Mark=True'G02的标记D(i).SX=Common(s).SXD(i).SY=Common(s).SYCommon(s).SX=Common(s).EXCommon(s).SY=Common(s).EYCommon(s).EX=D(i).SXCommon(s).EY=D(i).SYD(i)=Common(i+1)Common(i+1)=Common(s)Common(s)=D(i)EndIfNextsNextiIfAbs(Common(k).EX-Common(1).SX)>0.001AndAbs(Common(k).EY-Common(1).SY)>0.001Then
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 娱乐行业线上娱乐平台开发与运营方案
- 提振消费的策略与路径探索
- oa采购合同标准文本
- 义齿业务合同标准文本
- 保险延期合同标准文本
- 高中政治同步课时单元综合训练卷系列-高一必修2-综合内容与测试二(教师版)-含解析
- 小学安防踩踏课件
- 语言能力与专业发展试题及答案
- 市场调研与投资策略试题及答案
- 引人入胜的银行从业资格考试试题及答案
- 2024年上海杨浦区社区工作者笔试真题
- 建筑消防工程监理细则
- 2024年贵州贵州乌江煤层气勘探开发有限公司招聘笔试真题
- 2025年社会工作者职业水平考试初级综合能力测试题库
- 四川2025年01月成都市金牛区人民政府金泉街道办事处2025年招考2名社区工作者笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025届山东省青岛市高三下学期一模英语试题(含答案)
- 导数压轴大题归类知识清单(15题型提分练) 原卷版-2025年高考数学一轮复习
- 2025春统编版(2024)道德与法治一年级下册第二单元我们一起长大《第6课 请帮我一下》教学设计(名师教案)表格版
- 中学生心理健康与道德教育知到课后答案智慧树章节测试答案2025年春青海师范大学
- 气管切开非机械通气患者气道护理团体标准课件
- (二调)武汉市2025届高中毕业生二月调研考试 英语试卷(含标准答案)+听力音频
评论
0/150
提交评论