📄 fms_simulationview.cpp
字号:
// 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 + -