⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mshowview.cpp

📁 用VC++开发的一个数控加工的仿真程序。此程序能根据NC代码仿真生成加工轨迹
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MshowView.cpp : implementation of the CMshowView class
//

#include "stdafx.h"
#include "Mshow.h"

#include "MshowDoc.h"
#include "MshowView.h"
#include "MainFrm.h"
#include "drive.h"


#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define CodeMax 50
volatile  int a;
volatile  int thread;
volatile  int pthread;
volatile  int work;
volatile  int start;
volatile  int pause;
volatile  int stop;
volatile  int m_w;
int x=100;
int y=300;

int b=1;
int m_pn;
int m_px;
int m_py;

int m_M[CodeMax];
int m_F[CodeMax];
int m_S[CodeMax];
//int m_R[CodeMax];
int m_K[CodeMax];
int m_J[CodeMax];
int m_I[CodeMax];
int m_Z[CodeMax];
int m_Y[CodeMax];
int m_X[CodeMax];
int m_G[CodeMax];
int m_N[CodeMax];

volatile int m_n;
/////////////////////////////////////////////////////////////////////////////
// CMshowView

IMPLEMENT_DYNCREATE(CMshowView, CView)

BEGIN_MESSAGE_MAP(CMshowView, CView)
	//{{AFX_MSG_MAP(CMshowView)
	ON_UPDATE_COMMAND_UI(ID_TRUEXY,OnUpdateXY)
	ON_COMMAND(ID_STARTTHREAD, OnStartthread)
	ON_COMMAND(ID_STOPTHREAD, OnStopthread)
	ON_COMMAND(ID_PAUSETHREAD, OnPausethread)
	ON_COMMAND(ID_SENDDATE, OnSenddate)
	ON_WM_SETCURSOR()
	ON_WM_MOUSEMOVE()
	ON_UPDATE_COMMAND_UI(ID_STARTTHREAD, OnUpdateStartthread)
	ON_UPDATE_COMMAND_UI(ID_PAUSETHREAD, OnUpdatePausethread)
	ON_UPDATE_COMMAND_UI(ID_STOPTHREAD, OnUpdateStopthread)
	ON_UPDATE_COMMAND_UI(ID_XY, OnUpdateZB)
	ON_COMMAND(ID_XY, OnZB)
	ON_COMMAND(ID_STARTWORK, OnStartwork)
	ON_UPDATE_COMMAND_UI(ID_STARTWORK, OnUpdateStartwork)
	ON_BN_CLICKED(IDC_BUTTON_SIM, OnButtonSim)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMshowView construction/destruction

CMshowView::CMshowView()
{
	// TODO: add construction code here
	m_pnewthread = NULL;
}

CMshowView::~CMshowView()
{
}

BOOL CMshowView::PreCreateWindow(CREATESTRUCT& cs)  //绘图的界面
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
    cs.lpszClass=AfxRegisterWndClass(
		CS_HREDRAW|CS_VREDRAW,
		0,
		(HBRUSH)::GetStockObject(BLACK_BRUSH),
		0);
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMshowView drawing

void CMshowView::OnDraw(CDC* pDC)
{
	CMshowDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    
	if(b==1)
	{
		CPen newpen;
		CPen *oldpen;
		newpen.CreatePen(PS_SOLID,1,RGB(0,255,0));
		oldpen=pDC->SelectObject(&newpen);
		pDC->MoveTo(x,0);
	    pDC->LineTo(x,600);
        pDC->MoveTo(0,y);
	    pDC->LineTo(600,y);




	/*


  //缩短型刀补 直线接直线
		pDC->MoveTo(x,y);
			pDC->LineTo(x+80,y-80);
			pDC->LineTo(x+160,y-120);
			
			pDC->LineTo(x+240,y-80);
			pDC->LineTo(x+320,y);
			pDC->LineTo(x+300,y-(-40));
	
			float r1,r2;
			
			int xs,ys;
	
			pDC->Arc(10,90,110,190,110,140,10,140);
	
	
			
			int tr = 20;
			float x1,y1,x2,y2;
			r1 = sqrt(80.0 * 80.0 + 40.0 * 40.0);
	
	
	
			xs = (int)(80 + tr * 40/r1); 
			ys = (int)(80 - tr *80/r1);
	
	
			pDC->MoveTo(x,y);
			pDC->LineTo(x+xs,y-ys);
	
	
			newpen.DeleteObject();
			newpen.CreatePen(PS_SOLID,1,RGB(0,255,255));
			oldpen=pDC->SelectObject(&newpen);
	
			pDC->MoveTo(x+xs,y-ys);
			pDC->LineTo(x+80,y-80);
	
			newpen.DeleteObject();
			newpen.CreatePen(PS_SOLID,1,RGB(0,255,0));
			oldpen=pDC->SelectObject(&newpen);
			
			pDC->MoveTo(x+xs,y-ys);
			
			float tmp0,tmp1,tmp2;
			char bf[40];
	
			r1 = sqrt(80.0 * 80.0 + 40.0 * 40.0);
			r2 = sqrt(80.0 * 80.0 + 40.0 * 40.0);
			x1 = 80; y1 = 40;
			x2 = 80; y2 = -40;
	
	
			tmp0 = (1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);
			
			
	
			tmp1 = tr *(y1/r1+y2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);
			
			tmp2 = tr *(x1/r1+x2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);	
	
	
			pDC->LineTo(x+(int)(160+tmp1),y-(int)(120 -tmp2) );
			
			r1 = sqrt(80.0 * 80.0 + 40.0 * 40.0);
			r2 = sqrt(80.0 * 80.0 + 80.0 * 80.0);
			x1 = 80; y1 = -40;
			x2 = 80; y2 = -80;
	
	
			tmp0 = (1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);
			
				
	
			tmp1 = tr *(y1/r1+y2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);
			
			tmp2 = tr *(x1/r1+x2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);	
			
	
	
			pDC->LineTo(x+(int)(240+tmp1),y-(int)(80 -tmp2) );
	
	
			r1 = sqrt(80.0 * 80.0 + 80.0 * 80.0);
			
				
			
			xs = (int)(320 + tr * (-80)/r1); 
			ys = (int)(0 - tr *80/r1);
			
			pDC->LineTo(x+xs,y-ys);
	
			pDC->LineTo(x+300,y-(-40));*/



/*
//缩短型 直线接圆弧 圆弧接直线
pDC->MoveTo(x,y);
pDC->LineTo(x+80,y-80);
pDC->LineTo(x+160,y-120);

pDC->Arc(x+80,y-120,x+240,y-(-40),x+240,y-40,x+160,y-120);

pDC->MoveTo(x+240,y-40);
//pDC->LineTo(x+240,y-80);
pDC->LineTo(x+230,y);
pDC->LineTo(x+210,y-(-40));

float r1,r2;

int xs,ys;



int tr = 20;
float x1,y1,x2,y2;
r1 = sqrt(80.0 * 80.0 + 40.0 * 40.0);



xs = (int)(80 + tr * 40/r1); 
ys = (int)(80 - tr *80/r1);


pDC->MoveTo(x,y);
pDC->LineTo(x+xs,y-ys);


newpen.DeleteObject();
newpen.CreatePen(PS_SOLID,1,RGB(0,255,255));
oldpen=pDC->SelectObject(&newpen);

pDC->MoveTo(x+xs,y-ys);
pDC->LineTo(x+80,y-80);

newpen.DeleteObject();
newpen.CreatePen(PS_SOLID,1,RGB(0,255,0));
oldpen=pDC->SelectObject(&newpen);

pDC->MoveTo(x+xs,y-ys);

float tmp0,tmp1,tmp2;
char bf[40];

r1 = sqrt(80.0 * 80.0 + 40.0 * 40.0);
r2 = sqrt(80.0 * 80.0 + 0.0 * 0.0);
x1 = 80; y1 = 40;x2 = 80; y2 = 0;


tmp0 = (1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);



tmp1 = tr *(y1/r1+y2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);

tmp2 = tr *(x1/r1+x2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);	

float tmp3,tmp4;
pDC->LineTo(x+(int)(160+tmp1),y-(int)(120 -tmp2) );
tmp3 =160+tmp1; tmp4 = 120 -tmp2;
//圆弧段
r1 = sqrt(0.0 * 0.0 + 80.0 * 80.0);
r2 = sqrt(10.0 * 10.0 + 40.0 * 40.0);
x1 = 0; y1 = -80;
x2 = -10; y2 = -40;


tmp0 = (1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);



tmp1 = tr *(y1/r1+y2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);

tmp2 = tr *(x1/r1+x2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);	


pDC->Arc(x+80+tr,y-(120-tr),x+240-tr,y-(-40+tr),x+(int)(240+tmp1),y-(int)(40 -tmp2),x+(int)tmp3,y-(int)tmp4);

//pDC->LineTo(x+(int)(240+tmp1),y-(int)(40 -tmp2) );


newpen.DeleteObject();
newpen.CreatePen(PS_SOLID,1,RGB(0,255,255));
oldpen=pDC->SelectObject(&newpen);

pDC->MoveTo(x+(int)(240+tmp1),y-(int)(40 -tmp2));
pDC->LineTo(x+240,y-40);

newpen.DeleteObject();
newpen.CreatePen(PS_SOLID,1,RGB(0,255,0));
oldpen=pDC->SelectObject(&newpen);








r1 = sqrt(10.0 * 10.0 + 40.0 * 40.0);



xs = (int)(230 + tr * (-40)/r1); 
ys = (int)(0 - tr *(-10)/r1);

pDC->MoveTo(x+(int)(240+tmp1),y-(int)(40 -tmp2));

//char bf[40];
sprintf(bf," %f %f ",tmp1,tmp2);
AfxMessageBox(bf);



pDC->LineTo(x+xs,y-ys);

pDC->LineTo(x+210,y-(-40));
*/

		
	


			


  //缩短型 + 圆弧过渡型刀补 直线接直线
			pDC->MoveTo(x,y);
			pDC->LineTo(x+80,y-80);

			pDC->LineTo(x+120,y-60);
			



			pDC->LineTo(x+160,y-120);
			
			pDC->LineTo(x+240,y-80);
			pDC->LineTo(x+320,y);
			pDC->LineTo(x+300,y-(-40));
	
			float r1,r2;
			
			int xs,ys;
	
			pDC->Arc(10,90,110,190,110,140,10,140);
	
	
			
			int tr = 20;
			float x1,y1,x2,y2;
			r1 = sqrt(40.0 * 40.0 + 20.0 * 20.0);
	
	
	
			xs = (int)(80 + tr * (-20)/r1); 
			ys = (int)(80 - tr *40/r1);
	
	
			pDC->MoveTo(x,y);
			pDC->LineTo(x+xs,y-ys);
	
	
			newpen.DeleteObject();
			newpen.CreatePen(PS_SOLID,1,RGB(0,255,255));
			oldpen=pDC->SelectObject(&newpen);
	
			pDC->MoveTo(x+xs,y-ys);
			pDC->LineTo(x+80,y-80);
	
			newpen.DeleteObject();
			newpen.CreatePen(PS_SOLID,1,RGB(0,255,0));
			oldpen=pDC->SelectObject(&newpen);
			
			pDC->MoveTo(x+xs,y-ys);



			
			float tmp0,tmp1,tmp2;
			char bf[40];


			r1 = sqrt(40.0 * 40.0 + 20.0 * 20.0);
			r2 = sqrt(40.0 *40.0 + 60.0 * 60.0);			 

			x1 = 40; y1 = -20;
			x2 = 40; y2 = 60;

			int xs1,xs2,ys1,ys2;

			xs1 = (int)(120 + tr * y1 / r1);
			ys1 = (int)(60 - tr * x1 / r1);
			xs2 = (int)(120 + tr * y2 / r2);
			ys2 = (int)(60 - tr * x2 /r2);

			pDC->LineTo(x+xs1,y-ys1);


			pDC->ArcTo(x+120 -tr,y-(60+tr),x+120+tr,y-(60-tr),x+xs1,y-ys1,x+xs2,y-ys2 );





			
			
			
			newpen.DeleteObject();
			newpen.CreatePen(PS_SOLID,1,RGB(0,255,255));
			oldpen=pDC->SelectObject(&newpen);
			
	//		pDC->MoveTo(x+xs1,y-ys1);
	//		pDC->LineTo(x+120,y-60);
	//		pDC->LineTo(x+xs2,y-ys2);
			
			newpen.DeleteObject();
			newpen.CreatePen(PS_SOLID,1,RGB(0,255,0));
			oldpen=pDC->SelectObject(&newpen);
			
		

			pDC->MoveTo(x+xs2,y-ys2);
			
			r1 = sqrt(40.0 * 40.0 + 60.0 * 60.0);
			r2 = sqrt(80.0 * 80.0 + 40.0 * 40.0);
			x1 = 40; y1 = 60;
			x2 = 80; y2 = -40;
	
	
			tmp0 = (1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);
			
			
	
			tmp1 = tr *(y1/r1+y2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);
			
			tmp2 = tr *(x1/r1+x2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);	
	
	
			pDC->LineTo(x+(int)(160+tmp1),y-(int)(120 -tmp2) );
			
			r1 = sqrt(80.0 * 80.0 + 40.0 * 40.0);
			r2 = sqrt(80.0 * 80.0 + 80.0 * 80.0);
			x1 = 80; y1 = -40;
			x2 = 80; y2 = -80;
	
	
			tmp0 = (1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);
			
				
	
			tmp1 = tr *(y1/r1+y2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);
			
			tmp2 = tr *(x1/r1+x2/r2) /(1+ x1 * x2/r1/r2 + y1 * y2/r1/r2);	
			
	
	
			pDC->LineTo(x+(int)(240+tmp1),y-(int)(80 -tmp2) );
	
	
			r1 = sqrt(80.0 * 80.0 + 80.0 * 80.0);
			
				
			
			xs = (int)(320 + tr * (-80)/r1); 
			ys = (int)(0 - tr *80/r1);
			
			pDC->LineTo(x+xs,y-ys);
	
			pDC->LineTo(x+300,y-(-40));

		






		
		pDC->SelectObject(oldpen);
		newpen.DeleteObject();
	}
	if(start==1||pause==1||stop==1)
	{
		Onpaint();
	}
        
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMshowView diagnostics

#ifdef _DEBUG
void CMshowView::AssertValid() const
{
	CView::AssertValid();
}

void CMshowView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMshowDoc* CMshowView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMshowDoc)));
	return (CMshowDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMshowView message handlers

void CMshowView::OnStartthread() //线程开始
{
	
	thread=1;
	work=0;
	start=0;
	pause=1;
	stop=1;
	m_w=1;
	
	
    if(pthread==1)
	{	
		pthread=0;
	}
	else
	{
	m_pn=0;
	m_pdlgbar = &(((CMainFrame*)AfxGetMainWnd())->m_wndDialogBar);
	m_pnewthread = AfxBeginThread(ThreadProc,this,THREAD_PRIORITY_NORMAL);
	}
    Invalidate();
}
void CMshowView::OnStartwork() 
{
	
	thread=1;
	work=0;
	start=0;
	pause=1;
	stop=1;
	m_w=1;
	
	
    if(pthread==1)
	{	
		pthread=0;
	}
	else
	{
		m_pn=0;
		m_pdlgbar = &(((CMainFrame*)AfxGetMainWnd())->m_wndDialogBar);
		m_pnewthread = AfxBeginThread(ThreadProc,this,THREAD_PRIORITY_NORMAL);
	}
    Invalidate();
}

void CMshowView::OnStopthread() //线程结束
{
	thread=0;    
	start=1;
	work=1;
	pause=0;
	stop=0;
	pthread=0;
}

void CMshowView::OnPausethread() //线程暂停(挂起)
{   
//	if(m_w==1)
//	{start=1;}
//	else
//	{work=1;}
//	pause=0;
//    stop=1;
//	pthread=1;
	if (pthread==0) 
	{
		m_pnewthread->SuspendThread();
		pthread=1;
	}
	else
	{
		m_pnewthread->ResumeThread();
		pthread=0;
	}
	

   
}

UINT ThreadProc(LPVOID param)  //画线模拟线程
{
    ASSERT(param);
    CMshowView *pMshowview = (CMshowView*)param;


	CString xp,yp;
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -