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

📄 fms_simulationview.cpp

📁 一个自己编写的柔性制造的仿真软件,完全是自己编写的软件源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// FMS_SIMULATIONView.cpp : implementation of the CFMS_SIMULATIONView class
//

#include "stdafx.h"
#include "FMS_SIMULATION.h"

#include "FMS_SIMULATIONDoc.h"
#include "FMS_SIMULATIONView.h"
#include "FMS.h"
#include "NewTask.h"
#include "TaskDisplay.h"
#include "TaskInall.h"

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

CBrush newbrush(RGB(11,190,24));
CBrush blackbrush(RGB(0,0,0));
CBrush greenbrush(RGB(0,255,0));
CBrush redbrush(RGB(255,0,0));
CBrush bluebrush(RGB(151,143,15));
CBrush workpiecebrush(HS_FDIAGONAL,RGB(50,50,50));
CBrush loadstopbrush(RGB(40,95,236));
int task_inall;
char *end_task="卸工件";
char *now_task;
int step_agv=0;
int step_workpiece=0;
int task_num=0;		//当前加工任务是第几个
int task_procedure_temp;	//中间参数,记录当前任务的工序号
int plan_task_num=0;		//记录计划表中已经加工到第几个
int Storage_num=0;
int load_remove=1;
int BUTTON_DOWN=0;
int string_time=1;		//记录字显示时间
int left_button_num;
int assem_manu_over_flag[10];
unsigned long time_manu[10],time_manu_inall,time_begin;
int assem_manu_time[10];	//记录每个工位需要加工的时间
int doc_flag=0;	
/////////////////////////////////////////////////////////////////////////////
// CFMS_SIMULATIONView

IMPLEMENT_DYNCREATE(CFMS_SIMULATIONView, CView)

BEGIN_MESSAGE_MAP(CFMS_SIMULATIONView, CView)
	//{{AFX_MSG_MAP(CFMS_SIMULATIONView)
	ON_COMMAND(ID_FILE_NEW, OnFileNew)
	ON_WM_TIMER()
	ON_WM_ERASEBKGND()
	ON_COMMAND(ID_START_TASK, OnStartTask)
	ON_WM_LBUTTONDOWN()
	ON_COMMAND(ID_FILE_STOP, OnFileStop)
	ON_COMMAND(ID_LOOK_TASK, OnLookTask)
	ON_COMMAND(ID_LOOK_TONGJI, OnLookTongji)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CFMS_SIMULATIONView construction/destruction

CFMS_SIMULATIONView::CFMS_SIMULATIONView()
{
	// TODO: add construction code here

}

CFMS_SIMULATIONView::~CFMS_SIMULATIONView()
{
}

BOOL CFMS_SIMULATIONView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CFMS_SIMULATIONView drawing

void CFMS_SIMULATIONView::OnDraw(CDC* pDC)
{
	CFMS_SIMULATIONDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	area_Initiant(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CFMS_SIMULATIONView printing

BOOL CFMS_SIMULATIONView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CFMS_SIMULATIONView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CFMS_SIMULATIONView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CFMS_SIMULATIONView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CFMS_SIMULATIONView message handlers

void CFMS_SIMULATIONView::area_Initiant(CDC *pDC)
{
	int i;
	int j;
	char string[30];
	CBrush *poldbrush;
	CDC MemDC;
	CBitmap MemBitmap;
	MemDC.CreateCompatibleDC(pDC);
	MemBitmap.CreateCompatibleBitmap(pDC,850,460);  
	CBitmap   *pOldBit=MemDC.SelectObject(&MemBitmap);   
	MemDC.FillSolidRect(0,0,850,460,RGB(255,255,255));   
	poldbrush=MemDC.SelectObject(&redbrush);
	for(i=0;i<=1;i++)
		MemDC.Rectangle(rect_line[i]);
	MemDC.SelectObject(&blackbrush);
	MemDC.Rectangle(rect_road);
	MemDC.SelectObject(&loadstopbrush);
	MemDC.Rectangle(rect_load);
	MemDC.Rectangle(rect_storage);
	MemDC.SelectObject(&newbrush);
	for(i=0;i<=9;i++)
		MemDC.Rectangle(rect_assem[i]);
	MemDC.SelectObject(&workpiecebrush);
	MemDC.Rectangle(rect_agv);
	MemDC.SelectObject(&bluebrush);
	for(i=0;i<12;i++)
		if(assem_every[i].workpiece_manu)
			MemDC.Rectangle(rect_assem_workpiece[i]);
	if(task_inall>=1)
		MemDC.Rectangle(rect_workpiece);
	for(i=0;i<10;i++)
	{
		if(assem_every[i+1].workpiece_manu==1)
		{
			if(assem_every[i+1].status_manu==1)
				MemDC.SelectObject(&greenbrush);
			else
				MemDC.SelectObject(&redbrush);
			MemDC.Ellipse(rect_manu_over_flag[i]);
		}
	}
	MemDC.SelectObject(poldbrush);

	char ss[30];
	MemDC.SetBkMode(TRANSPARENT);
	MemDC.DrawText("\n\n\n装\n\n卸\n\n站",rect_load,DT_CENTER|DT_MODIFYSTRING);
	MemDC.DrawText("\n\n\n小\n\n\n车",rect_agv,DT_CENTER|DT_MODIFYSTRING);
	MemDC.DrawText("\n立\n\n体\n\n仓\n\n库",rect_storage,DT_CENTER|DT_MODIFYSTRING);
	for(i=0;i<=9;i++)
	{
		sprintf(ss,"\n装\n\n配\n\n工\n\n位\n\n%d",i+1);
		MemDC.DrawText(ss,rect_assem[i],DT_CENTER|DT_MODIFYSTRING);
	}
	sprintf(ss,"柔 性 制 造 仿 真 系 统");
	MemDC.DrawText(ss,rect_caption,DT_CENTER|DT_MODIFYSTRING);
	if(BUTTON_DOWN)
	{
		if(left_button_num==0)
		{
			if(assem_every[0].workpiece_manu==1)
				sprintf(string,"TASK %d\nProcedure %d",plan_task_num+1,assem_every[left_button_num].procedure);
			else
				sprintf(string,"NO TASK!");
		}
		if((left_button_num>0)&&(left_button_num<=10))
		{
			if(assem_every[left_button_num].workpiece_manu==1)
				sprintf(string,"TASK %d\nProcedure %d",assem_every[left_button_num].task_num+1,assem_every[left_button_num].procedure);
			else
				sprintf(string,"NO TASK!");
		}
		if((left_button_num>=0)&&(left_button_num<=10))
			MemDC.DrawText(string,rect_string,DT_CENTER|DT_MODIFYSTRING);
		if(left_button_num==11)
		{
			if(storage_num>0)
			{
				for(j=0;j<storage_num;j++)
				{
					sprintf(string,"TASK %d Procedure %d",storage[j].task_num+1,storage[j].procedure-1);
					MemDC.DrawText(string,rect_string,DT_CENTER|DT_MODIFYSTRING);
					rect_string.top=rect_string.bottom;
					rect_string.bottom=rect_string.top+30;	
				}
				rect_string.top=rect_storage.bottom+10;
				rect_string.bottom=rect_storage.bottom+40;	
			}
			else
			{
				sprintf(string,"NO TASK!");
				MemDC.DrawText(string,rect_string,DT_CENTER|DT_MODIFYSTRING);
			}
		}
	}
	pDC->BitBlt(0,0,850,460,&MemDC,0,0,SRCCOPY);   
	MemBitmap.DeleteObject();   
	MemDC.DeleteDC(); 

}

void CFMS_SIMULATIONView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	int i;
	int j;
	CFMS_SIMULATIONDoc *pDoc=GetDocument();
	if(doc_flag)
	{
		for(i=0;i<task_inall;i++)
		{
			plan2[i].amount=pDoc->plan[i].amount;
			plan[i].amount=pDoc->plan[i].amount;
			plan[i].priority=pDoc->plan[i].priority;
			plan[i].time=pDoc->plan[i].time;
			for(j=1;atoi(pDoc->plan[i].working_procedure[j])>0;j++)
				strcpy(plan[i].working_procedure[j],pDoc->plan[i].working_procedure[j]);
			strcpy(plan[i].working_procedure[j],"卸工件");
		}
		doc_flag=0;
	}
	else
	{
		for(i=0;i<10;i++)
		{
			plan[i].amount=-1;
			plan2[i].amount=-1;
			time_manu[i]=0;
			assem_manu_time[i]=TIME_MANU;
			pDoc->plan[i].amount=-1;
		}
		task_inall=0;
	}	
	time_manu_inall=0;
	task_procedure_temp=0;
	storage_num=0;
	for(i=0;i<10;i++)
		assem_procedure_num[i]=1;
	for(i=0;i<12;i++)
	{
		assem_every[i].workpiece_manu=0;
		assem_every[i].status_manu=0;
	}
	assem_every[0].procedure=0;
	rect_road.left=50;
	rect_road.top=85;
	rect_road.right=60;
	rect_road.bottom=185;

	rect_storage.left=700-2;
	rect_storage.top=50;
	rect_storage.right=800-2;
	rect_storage.bottom=220;

	rect_load.left=60;
	rect_load.top=230;
	rect_load.right=90;
	rect_load.bottom=400;

	rect_workpiece.left=65;
	rect_workpiece.top=255;
	rect_workpiece.right=85;
	rect_workpiece.bottom=375;

	rect_agv.left=60;
	rect_agv.top=50;
	rect_agv.right=90;
	rect_agv.bottom=220;

	rect_line[0].left=60;
	rect_line[0].top=105;
	rect_line[0].right=700;
	rect_line[0].bottom=110;

	rect_line[1].left=60;
	rect_line[1].top=160;
	rect_line[1].right=700;
	rect_line[1].bottom=165;
	
	rect_assem_workpiece[0].top=rect_load.top+25;
	rect_assem_workpiece[0].right=rect_load.right-5;
	rect_assem_workpiece[0].left=rect_load.left+5;
	rect_assem_workpiece[0].bottom=rect_load.bottom-25;
	
	rect_caption.left=0;
	rect_caption.right=800;
	rect_caption.top=20;
	rect_caption.bottom=50;
	for(i=0;i<=9;i++)
	{
		rect_assem[i].left=120+60*i;
		rect_assem[i].top=230;
		rect_assem[i].right=150+60*i;
		rect_assem[i].bottom=400;
		rect_assem_workpiece[i+1].top=rect_assem[i].top+25;
		rect_assem_workpiece[i+1].right=rect_assem[i].right-5;
		rect_assem_workpiece[i+1].left=rect_assem[i].left+5;
		rect_assem_workpiece[i+1].bottom=rect_assem[i].bottom-25;
	}
	for(i=0;i<10;i++)
	{
		assem_manu_over_flag[i]=0;
		rect_manu_over_flag[i].left=rect_assem[i].left+10;
		rect_manu_over_flag[i].right=rect_assem[i].right-10;
		rect_manu_over_flag[i].top=rect_assem[i].bottom+5;
		rect_manu_over_flag[i].bottom=rect_assem[i].bottom+15;
	}
	rect_assem_workpiece[11].top=75;
	rect_assem_workpiece[11].right=760-2;
	rect_assem_workpiece[11].left=740-2;
	rect_assem_workpiece[11].bottom=195;
}
void CFMS_SIMULATIONView::OnFileNew() 
{
	// TODO: Add your command handler code here
	CNewTask dlg;
	int i,j,m,n;
	int m1,m2,m3;
	int k;
	task_inall=0;
	char ss_temp[30][10];
	if(dlg.DoModal()==IDOK)
	{
		for(i=0;i<task_inall;i++)
		{
			plan[i].amount=atoi(dlg.plans[i].amount);
            plan[i].priority=atoi(dlg.plans[i].priority);
			plan[i].time=atoi(dlg.plans[i].time);
			for(n=0;n<task_inall;n++)
				for(m=0;m<30;m++)
					strcpy(plan[n].working_procedure[m],dlg.plans[n].working_procedure[m]);
		}
		for(i=0;i<task_inall-1;i++)		//采用选择法进行排序
		{	
			k=i;
			for(j=i+1;j<task_inall;j++)
			{
				if(plan[j].priority<plan[i].priority)
				{
					m1=plan[i].amount;
					m2=plan[i].priority;
					m3=plan[i].time;
					for(n=1;atoi(plan[i].working_procedure[n])>0;n++)
						strcpy(ss_temp[n],plan[i].working_procedure[n]);
					plan[i].amount=plan[j].amount;
					plan[i].priority=plan[j].priority;
					plan[i].time=plan[j].time;
					for(n=1;atoi(plan[j].working_procedure[n])>0;n++)
						strcpy(plan[i].working_procedure[n],plan[j].working_procedure[n]);
					plan[j].amount=m1;
					plan[j].priority=m2;
					plan[j].time=m3;
					for(n=1;atoi(ss_temp[n])>0;n++)
						strcpy(plan[j].working_procedure[n],ss_temp[n]);
					k=j;
				}
			}
		}
		for(i=0;i<task_inall;i++)
			plan2[i].amount=plan[i].amount;
		CFMS_SIMULATIONDoc *pDoc=GetDocument();
		for(i=0;i<task_inall;i++)
		{
			pDoc->plan[i].amount=plan2[i].amount;
			pDoc->plan[i].priority=plan[i].priority;
			pDoc->plan[i].time=plan[i].time;
			for(j=1;atoi(plan[i].working_procedure[j])>0;j++)
				strcpy(pDoc->plan[i].working_procedure[j],plan[i].working_procedure[j]);
			strcpy(pDoc->plan[i].working_procedure[j],plan[i].working_procedure[j]);
		}
	}
}

void CFMS_SIMULATIONView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==11)
	{
		Invalidate();
		int dd;
		if(task_over())	//任务是不是都完成
		{
			time_manu_inall=GetTickCount()-time_begin;	
			KillTimer(11);
		}
		else	//还有任务没加工完
		{
			dd=workpiece_manu_over();
			if(dd)	//有已经加工完的(装配工位)
			{
				rect_agv_aim.left=rect_assem[dd-1].left;							
				rect_workpiece_aim.top=rect_agv.top+25;
				
				rect_workpiece.left=rect_assem_workpiece[dd].left;
				rect_workpiece.top=rect_assem_workpiece[dd].top;
				rect_workpiece.right=rect_assem_workpiece[dd].right;
				rect_workpiece.bottom=rect_assem_workpiece[dd].bottom;
				
				task_num=assem_every[dd].task_num;
				task_procedure_temp=assem_every[dd].procedure;
				assem_every[dd].workpiece_manu=0;
				assem_every[dd].status_manu=0;
				SetTimer(1,50,NULL);
				KillTimer(11);
			}
			else		//都没加工完
			{
				int dd;
				dd=priority_storage();
				if((storage_num>0)&&(priority_storage()>=0))		//仓库有工件
				{
					KillTimer(11);
					storage_have_workpiece();
				}
				else
				{
					if(assem_every[0].workpiece_manu)	//如果装卸站还有
					{
						plan[plan_task_num].amount--;
						task_num=plan_task_num;
						if(plan[plan_task_num].amount==0)
						{
							plan_task_num++;
							if(plan[plan_task_num].amount<0)
								assem_every[0].workpiece_manu=0;
							else
								assem_every[0].workpiece_manu=1;
						}
						else
							assem_every[0].workpiece_manu=1;
						task_procedure_temp=assem_every[0].procedure;
						rect_agv_aim.left=rect_load.left;
						rect_workpiece_aim.top=rect_agv.top+25;
						rect_workpiece.left=rect_assem_workpiece[0].left;
						rect_workpiece.top=rect_assem_workpiece[0].top;
						rect_workpiece.right=rect_assem_workpiece[0].right;
						rect_workpiece.bottom=rect_assem_workpiece[0].bottom;
						SetTimer(1,50,NULL);		//自动完成取,送
						KillTimer(11);	
					}
				}
			}
		}
	}
	if(nIDEvent==1)		//小车到装卸站
	{

⌨️ 快捷键说明

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