📄 数控插补程序view.cpp
字号:
// 数控插补程序View.cpp : implementation of the CMyView class
//
#include "stdafx.h"
#include "数控插补程序.h"
#include "数控插补程序Doc.h"
#include "数控插补程序View.h"
#include "Math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyView
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
// 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
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction
CMyView::CMyView()
{
// TODO: add construction code here
}
CMyView::~CMyView()
{
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMyView drawing
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//设置坐标系
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowOrg(-20000,15000);
pDC->SetWindowExt(int(200*200.00),-int(200*150.00));
CRect rc;
GetClientRect(&rc);
pDC->SetViewportOrg(0,0);
pDC->SetViewportExt(rc.Width(),rc.Height());
a1=pDoc->x1;
b1=pDoc->y1;
a2=pDoc->x2;
b2=pDoc->y2;
step=pDoc->step;
p1=pDoc->m1;
q1=pDoc->n1;
p2=pDoc->m2;
q2=pDoc->n2;
bc=pDoc->bc;
//画网格程序段
CPen hGreen(PS_DOT, 10, RGB(100,120,255));
CPen *pOld;
pOld=pDC->SelectObject(&hGreen);
int i,j;
for(i=-20000;i<20000;i+=1000)
{
pDC->MoveTo(i,-20000);
pDC->LineTo(i,20000);
}
for(j=-20000;j<20000;j+=1000)
{
pDC->MoveTo(-20000,j);
pDC->LineTo(20000,j);
}
pDC->SelectObject(pOld);
//画坐标轴程序段(选用兰色画笔)
CPen hBlue(PS_SOLID, 80, RGB(0,0,255));
if(pOld=pDC->SelectObject(&hBlue))
{
pDC->MoveTo(-20000,0);
pDC->LineTo(20000,0);
pDC->TextOut(19000,1000,"X");
pDC->MoveTo(0,-20000);
pDC->LineTo(0,20000);
pDC->TextOut(-1000,14000,"Y");
pDC->TextOut(0,-100,"0");
}
pDC->TextOut(-20000,-100,"-200");
pDC->TextOut(19000,-100,"200");
pDC->TextOut(100,-14000,"-150");
pDC->TextOut(100,15000,"150");
//画直线
pDC->MoveTo(int(a1*100),int(b1*100));
pDC->LineTo(int(a2*100),int(b2*100));
pDC->SelectObject(pOld);
double i1; i1=0.0;
double j1; j1=0.0;
double F; F=0.0;
int E; E=(abs(int(100*(a1-a2)))+abs(int(100*(b2-b1))))/int((100*step));
//设定插补直线的颜色和类型
CPen Pen6(PS_SOLID,80,RGB(255,0,0));
CPen *pOld6=pDC->SelectObject(&Pen6);
while(E>0)
{
//延时0.5秒
DWORD iTime=GetCurrentTime();
while(GetCurrentTime()<(iTime+500));
if(F>=0)//偏差判别
{
if((a2>a1)&&(b1>b2))
{//满足条件就向-Y轴发出一个脉冲
pDC->MoveTo(int(a1*100+i1*100),int(b1*100+j1*100));
pDC->LineTo(int(a1*100+i1*100),int(b1*100+(j1-step)*100));
j1=j1-step;
F=F-abs(int(100*(a2-a1))/100);
}
else if((a2<a1)&&(b1<b2))
{//满足条件就向-X轴发出一个脉冲
pDC->MoveTo(int(a1*100+i1*100),int(b1*100+j1*100));
pDC->LineTo(int(a1*100+(i1-step)*100),int(b1*100+j1*100));
i1=i1-step;
F=F-abs(int(100*(b2-b1))/100);
}
else if((a2<a1)&&(b1>b2))
{//满足条件就向-Y轴发出一个脉冲
pDC->MoveTo(int(a1*100+i1*100),int(b1*100+j1*100));
pDC->LineTo(int(a1*100+i1*100),int(b1*100+(j1-step)*100));
j1=j1-step;
F=F-abs(int(100*(a2-a1))/100);
}
else if((a2>a1)&&(b1<b2))
{//满足条件就向+X轴发出一个脉冲
pDC->MoveTo(int(a1*100+i1*100),int(b1*100+j1*100));
pDC->LineTo(int(a1*100+(i1+step)*100),int(b1*100+j1*100));
i1=i1+step;
F=F-abs(int(100*(b2-b1))/100);
}
}
else
{
if((a2>a1)&&(b1>b2))
{//满足条件就向+X轴发出一个脉冲
pDC->MoveTo(int(a1*100+i1*100),int(b1*100+j1*100));
pDC->LineTo(int(a1*100+(i1+step)*100),int(b1*100+j1*100));
i1=i1+step;
F=F+abs(int(100*(b2-b1)/100));
}
else if((a2<a1)&&(b1<b2))
{//满足条件就向+Y轴发出一个脉冲
pDC->MoveTo(int(a1*100+i1*100),int(b1*100+j1*100));
pDC->LineTo(int(a1*100+i1*100),int(b1*100+(j1+step)*100));
j1=j1+step;
F=F+abs(int(100*(a1-a2)/100));
}
else if((a2<a1)&&(b1>b2))
{//满足条件就向-X轴发出一个脉冲
pDC->MoveTo(int(a1*100+i1*100),int(b1*100+j1*100));
pDC->LineTo(int(a1*100+(i1-step)*100),int(b1*100+j1*100));
i1=i1-step;
F=F+abs(int(100*(b1-b2)/100));
}
else if((a2>a1)&&(b1<b2))
{//满足条件就向+Y轴发出一个脉冲
pDC->MoveTo(int(a1*100+i1*100),int(b1*100+j1*100));
pDC->LineTo(int(a1*100+i1*100),int(b1*100+(j1+step)*100));
j1=j1+step;
F=F+abs(int(100*(a2-a1)/100));
}
}
E=E-1;
}
pDC->SelectObject(pOld6);
//画圆弧
CPen hBlue1(PS_SOLID, 80, RGB(0,0,255));
CPen *pOld1;
pOld1=pDC->SelectObject(&hBlue);
t=sqrt(p1*p1+q1*q1);
pDC->Arc(-int(100*t),-int(100*t),int(100*t),int(100*t),int(100*p1),int(100*q1),int(100*p2),int(100*q2));
pDC->SelectObject(pOld1);
//设定插补圆弧的颜色和类型
CPen Pen4(PS_SOLID,80,RGB(255,0,0));
CPen *pOld2=pDC->SelectObject(&Pen4);
//插补圆弧 采用7位寄存器
int Jrx=0;//画右半圆时用
int Jry=0;
int Jrx1=0;//画左半圆时用
int Jry1=0;
int Jvx=int(100*q1);//存起点的Y坐标
int Jvy=int(100*p1);//存起点的X坐标
double c=sqrt(p1*p1+q1*q1);//半径
//判断是否到了终点
while((Jvy>0)||(Jvx!=int(100*q2)))
{
//延时0.5秒
DWORD iTime=GetCurrentTime();
while(GetCurrentTime()<(iTime+500));
//判断是右半圆
if(Jvy>0){
//一直累加直到有X轴或Y轴溢出
while((Jrx<12800)&&(Jry<12800))
{
if(Jvx<int(100*c))
Jry=Jvy+Jry;
//当加工位置已经到达终点时Jvx不再加
Jrx=Jvx+Jrx;
}
if((Jrx>=12800)&&(Jry<12800))//如果X轴溢出
{
Jrx=Jrx-12800;
//当加工位置已经到达终点时Jvx不再加
Jvy=Jvy-int(100*bc);
pDC->MoveTo(Jvy+int(100*bc),Jvx);
pDC->LineTo(Jvy,Jvx);
}
else if((Jrx<12800)&&(Jry>=12800))//如果Y轴溢出
{
Jry=Jry-12800;
Jvx=Jvx+int(100*bc);
pDC->MoveTo(Jvy,Jvx-int(100*bc));
pDC->LineTo(Jvy,Jvx);
}
else if((Jrx>=12800)&&(Jry>=12800))//如果X轴和Y轴都溢出
{
Jrx=Jrx-12800;
Jry=Jry-12800;
//当加工位置已经到达终点时Jvx不再加
Jvy=Jvy-int(100*bc);
Jvx=Jvx+int(100*bc);
pDC->MoveTo(Jvy+int(100*bc),Jvx-int(100*bc));
pDC->LineTo(Jvy,Jvx);
}
}
//判断是下半圆
else if((Jvy<=0)&&(Jvx>0))
{
//一直累加直到有X轴或Y轴溢出
while((Jrx1<12800)&&(Jry1<12800))
{
if(Jvy>-int(100*c))
Jrx1=Jvx+Jrx1;
//当加工位置已经到达终点时Jvy不再加
Jry1=-Jvy+Jry1;
}
if((Jrx1>=12800)&&(Jry1<12800))//如果X轴溢出
{
Jrx1=Jrx1-12800;
Jvy=Jvy-int(100*bc);
pDC->MoveTo(Jvy+int(100*bc),Jvx);
pDC->LineTo(Jvy,Jvx);
}
else if((Jrx1<12800)&&(Jry1>=12800))//如果Y轴溢出
{
Jry1=Jry1-12800;
Jvx=Jvx-int(100*bc);
pDC->MoveTo(Jvy,Jvx+int(100*bc));
pDC->LineTo(Jvy,Jvx);
}
else if((Jrx1>=12800)&&(Jry1>=12800))//如果X轴和Y轴都溢出
{
Jrx1=Jrx1-12800;
Jry1=Jry1-12800;
Jvy=Jvy-int(100*bc);
Jvx=Jvx-int(100*bc);
pDC->MoveTo(Jvy+int(100*bc),Jvx+int(100*bc));
pDC->LineTo(Jvy,Jvx);
}
}
}
pDC->SelectObject(pOld2);
}
/////////////////////////////////////////////////////////////////////////////
// CMyView printing
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics
#ifdef _DEBUG
void CMyView::AssertValid() const
{
CView::AssertValid();
}
void CMyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -