?? 數(shù)控插補程序view.cpp
字號:
// 數(shù)控插補程序View.cpp : implementation of the CMyView class
//
#include "stdafx.h"
#include "數(shù)控插補程序.h"
#include "數(shù)控插補程序Doc.h"
#include "數(shù)控插補程序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
//設(shè)置坐標系
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;
//畫網(wǎng)格程序段
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));
//設(shè)定插補直線的顏色和類型
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軸發(fā)出一個脈沖
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軸發(fā)出一個脈沖
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軸發(fā)出一個脈沖
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軸發(fā)出一個脈沖
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軸發(fā)出一個脈沖
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軸發(fā)出一個脈沖
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軸發(fā)出一個脈沖
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軸發(fā)出一個脈沖
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);
//設(shè)定插補圓弧的顏色和類型
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;
//當加工位置已經(jīng)到達終點時Jvx不再加
Jrx=Jvx+Jrx;
}
if((Jrx>=12800)&&(Jry<12800))//如果X軸溢出
{
Jrx=Jrx-12800;
//當加工位置已經(jīng)到達終點時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;
//當加工位置已經(jīng)到達終點時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;
//當加工位置已經(jīng)到達終點時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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -