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

📄 laddoc.cpp

📁 VC++ 写的PLC上位机编程软件。非常有用!
💻 CPP
字号:
// LADDoc.cpp : implementation file
//

#include "stdafx.h"
#include "MUL.h"
//#include "Iopoint.h"
#include "PointSet.h"
#include "Syntax.h"
#include "LADDoc.h"

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

extern int CurH;
extern int CurW;
extern int MaxRows;
extern int MaxCols;
extern CString filename;
/////////////////////////////////////////////////////////////////////////////
// CLADDoc

IMPLEMENT_DYNCREATE(CLADDoc, CDocument)

CLADDoc::CLADDoc()
{
   err_dlg=NULL;
   OpenFlag=FALSE;
   Rows=0;
   Cols=0;
}

BOOL CLADDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;
	m_mPlc.newfile();
	DeletePoints();
	return TRUE;
}

CLADDoc::~CLADDoc()
{
	delete err_dlg;
	DeletePoints();
}


BEGIN_MESSAGE_MAP(CLADDoc, CDocument)
	//{{AFX_MSG_MAP(CLADDoc)
	ON_COMMAND(ID_COMPILE_LAD, OnCompileLad)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLADDoc diagnostics

#ifdef _DEBUG
void CLADDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CLADDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLADDoc serialization

void CLADDoc::Serialize(CArchive& ar)
{
	CArchiveException fileexception;
	if (ar.IsStoring())
	{
		// TODO: add storing code here
		CIO *point;
		IOPOINT *temp;

		if (m_pointArray.GetSize()>0)
		{
			DeletePoints();
		}

		point=new CIO;
		point->name="";
		point->addr="";
		point->code="";
		point->Rows=Rows;
		point->Cols=Cols;
		point->flag=0;
		point->fiveflag=0;
		point->xpoint=0;
		point->ypoint=0;
		m_pointArray.Add(point);

		for (int i=0;i<Rows;i++)
		{
			for(int j=0;j<Cols;j++)
			{
				if (m_mPlc.point_array[i][j]!=NULL)
				{
					CString str;
					point=new CIO;
					temp=m_mPlc.point_array[i][j];
					temp->getname(&str);
					point->name=str;
					temp->getaddr(&str);
					point->addr=str;
					temp->getcode(&str);
					point->code=str;
					point->Rows=Rows;
					point->Cols=Cols;
					point->flag=temp->getflag();
					point->fiveflag=temp->getfiveflag();
					point->xpoint=temp->getxpoint();
					point->ypoint=temp->getypoint();
					m_pointArray.Add(point);
				}
			}
		}
		m_pointArray.Serialize(ar);
		this->SetModifiedFlag(FALSE);
	}
	else
	{
		// TODO: add loading code here
		BOOL flag;
		IOPOINT *p;
		CIO * io;

		m_pointArray.Serialize(ar);
		//第一个是CIO所以从1开始
		for (int n=1;n<m_pointArray.GetSize();n++)
		{
			io=(CIO*)m_pointArray.GetAt(n);
			flag=TRUE;
			switch (io->flag)
			{
			case 0:
					if (io->fiveflag==5)
					{
						p=new ERECT;
						p->setfiveflag(5);
					}
					else
						flag=FALSE;
					break;
			case 1:
					p=new LD;
					break;
			case 2:
					p=new LDI;
					break;
			case 3:
					p=new OR;
					break;
			case 4:
					p=new ORI;
					break;
			case 6:
					p=new HOR;
					break;
			case 7:
					p=new OUTPOINT;
					break;
			default:
					p=new ADDTION;
					break;
			}
			if (flag)
			{
				p->setname(io->name);
				p->setaddr(io->addr);
				p->setcode(io->code);
				p->setflag(io->flag);
				p->setwhere(io->xpoint,io->ypoint);
				m_mPlc.insert_point(p);
				if (io->flag!=0 && io->fiveflag==5)
				{
					p=new ERECT;
					p->setfiveflag(5);
					p->setwhere(io->xpoint,io->ypoint);
					m_mPlc.insert_point(p);
				}
			}
		}
		io=(CIO*)m_pointArray.GetAt(0);
		SetRowCol(io->Rows,io->Cols);
		OpenFlag=TRUE;
	}
	
}

/////////////////////////////////////////////////////////////////////////////
// CLADDoc commands

void CLADDoc::erase_point(int x, int y, CDC *pDC)
{
	CBrush brush;
	brush.CreateStockObject(WHITE_BRUSH);
	CRect rect(x+1,y,x+::CurW,y+CurH+1);
    pDC->FillRect(rect,&brush);

    CPen pen;
	CPen *pOldPen;
	pen.CreateStockObject(WHITE_PEN);
	pOldPen=pDC->SelectObject(&pen);
	pDC->MoveTo(x+::CurW,y-9);
    pDC->LineTo(x+::CurW,y+::CurH-10); 
	pDC->SelectObject(pOldPen);
  
	pDC->SetPixel(x+::CurW,y+::CurH-10,RGB(0,0,0));

	
	if(x>=::CurW*(Cols-1)+50)
	{ 
		pDC->MoveTo(x+::CurW,y-9);
        pDC->LineTo(x+::CurW,y+::CurH);
	}  
	this->SetModifiedFlag();
}

void CLADDoc::insert_point(UINT pID, int x, int y, int row, int col, CDC *pDC)
{
   	int insertflag;
	int eraseflag;
	IOPOINT *point;
	eraseflag=1;
	insertflag=1;
	switch(pID)
	{
		case 1:
			point=new LD;
		    point->setflag(1);
		    point->setcode("LD");
		    break;
		case 2:
		    point=new LDI;
		    point->setflag(2);
		    point->setcode("LDI");
		    break;
		case 3:
			if (row>0)
			{
				point=new OR;
				point->setflag(3);
				point->setcode("OR");
			}
			else
				insertflag=0;
		    break;
	    case 4:
			if (row>0)
			{
				point=new ORI;
				point->setflag(4);
				point->setcode("ORI");
			}
			else
				insertflag=0;
		    break;
        case 51:
			eraseflag=0;
			point=new  ERECT;
		    point->setfiveflag(5);
		    point->setcode("ERECT");
		    break;
        case 52:
   	        point=new HOR;
			point->setflag(6);
			point->setcode("HOR");
			break;    
	    case 6:
		    point=new OUTPOINT;
		    point->setflag(7);
		    point->setcode("OUT");
		    break;
        case 7:
		    point=new ADDTION;
		    point->setflag(100);
		    break;
    }
    if (m_mPlc.point_array[row][col]!=NULL && eraseflag)
	{
		erase_point(x,y,pDC);
	}
	if (insertflag)
	{
		try{
			point->setwhere(row,col);
			m_mPlc.insert_point(point);
			m_mPlc.point_array[row][col]->print(x,y,pDC);	
			if (pID==3|| pID==4)
			{
				point=new ERECT;
				point->setfiveflag(5);
				point->setwhere(row,col);
				m_mPlc.insert_point(point);
				if (col>0)
				{
					point=new ERECT;
					point->setfiveflag(5);
					point->setwhere(row,col-1);
					m_mPlc.insert_point(point);
				}
			}
		}
		catch(...)
		{
			POSITION pos=this->GetFirstViewPosition();
			CView * pView=this->GetNextView(pos);
			pView->MessageBox("可能梯形图绘制有错、或元器件设置错误\n\n请将文件保存关闭后重新打开能解决问题。\n\n若仍存在问题,请与开发商联系。","绘制出错",MB_ICONERROR|MB_OK);
		}
	}
	this->SetModifiedFlag();
}



void CLADDoc::OnCompileLad() 
{
	// TODO: Add your command handler code here
	CString pathname=this->GetPathName();
	if (pathname=="")
	{
		AfxMessageBox("请先保存文件,再进行编译!");
		return ;
	}
	this->OnSaveDocument(pathname);
	::filename=pathname+this->GetTitle();
	int i=::filename.Find('.');
	if (i!=-1)
		::filename=::filename.Mid(0,i);
	::filename+=".plc";
	CString str;
	try{
		if (!m_mPlc.compiled(str))
			str.Format("编译成功!");
		if (err_dlg)
		{
			err_dlg->Refresh(str);
			err_dlg->ShowWindow(SW_RESTORE);
		}
		else
		{
			err_dlg=new CSyntax(str,AfxGetMainWnd());
			err_dlg->CenterWindow();
			err_dlg->ShowWindow(SW_SHOW);
		}
		
		err_dlg->UpdateData(FALSE);
	}
	catch(...)
	{
		POSITION pos=this->GetFirstViewPosition();
		CView * pView=this->GetNextView(pos);
		pView->MessageBox("可能梯形图绘制有错、\n或文件不能建立","编译出错",MB_ICONERROR|MB_OK);
	}
}

void CLADDoc::SetAddition(int row, int col, int flag, CString str)
{
	m_mPlc.point_array[row][col]->setflag(flag);
	m_mPlc.point_array[row][col]->setcode(str);
}


int CLADDoc::TestPointType(int row, int col)
{
    int result;
	IOPOINT *point;
	point=m_mPlc.point_array[row][col];
	if (point==NULL)
		result=0;
	else if(point->getflag()>=8)
		result=2;
		else result=1;
	return result;
}

void CLADDoc::Process(UINT pID, int x, int y, CDC *pDC)
{
	int row,col;
	row=y/::CurH;
	col=(x-50)/::CurW;
    if (pID==8)
	{
		if (m_mPlc.point_array[row][col]!=NULL)
		{
			try{
				erase_point(x,y,pDC);
				m_mPlc.remove_point(row,col);
			}
			catch(...)
			{
				POSITION pos=this->GetFirstViewPosition();
				CView * pView=this->GetNextView(pos);
				pView->MessageBox("擦除错误!可能梯形图绘制有错\n\n请将文件保存关闭后重新打开能解决问题。\n\n若仍存在问题,请与开发商联系。","擦除出错",MB_ICONERROR|MB_OK);
			}
			return;
		}
	}	
/*	if (pID>0 && pID<8)  */
	else 
	{
		if (pID==6 || pID==7)
		{
			for (int i=col;i<Cols-1;i++)
			{
				insert_point(52,x,y,row,i,pDC);
				x+=::CurW;
			}
			col=Cols-1;
		}
		insert_point(pID,x,y,row,col,pDC);
	}
}

void CLADDoc::ReDraw(int x, int y,CDC *pDC)
{
    int row,col;
	row=y/::CurH;
	col=(x-50)/::CurW;
	x=col*::CurW+50;
	y=row*::CurH;
	if (m_mPlc.point_array[row][col]!=NULL && m_mPlc.point_array[row][col]->getflag()!=6)
	{
		CPointSet dlg_PointSet(m_mPlc.point_array[row][col]);
		
		if (dlg_PointSet.DoModal()==IDOK)
		{
			int flag;
			flag=m_mPlc.point_array[row][col]->getflag();
			if (flag==12 || flag==13)
			{
				if (dlg_PointSet.m_strAddr.GetLength()!=0)
					m_mPlc.point_array[row][col]->setcode(dlg_PointSet.m_strAddr);
				m_mPlc.point_array[row][col]->setaddr("");
			}
			else
				m_mPlc.point_array[row][col]->setaddr(dlg_PointSet.m_strAddr);
			m_mPlc.point_array[row][col]->setname(dlg_PointSet.m_strName);
			erase_point(x,y,pDC);
			m_mPlc.point_array[row][col]->print(x,y,pDC);
		}
	}
}

void CLADDoc::UpdateWorkare(CDC *pDC)
{
	int startx;
	int starty;
	int i;
	for (i=0;i<Rows;i++)
	{
		int j;
		for (j=0;j<Cols;j++)
		{
			if (m_mPlc.point_array[i][j]!=NULL)
			{
				startx=j*::CurW+50;
				starty=i*::CurH;
				m_mPlc.point_array[i][j]->print(startx,starty,pDC);
			}
		}
		for (;j<::MaxCols;j++)
		{
			if (m_mPlc.point_array[i][j]!=NULL)
				m_mPlc.remove_point(i,j);
		}
	}
	for (;i<::MaxRows;i++)
		for (int n=0;n<::MaxCols;n++)
		{
			if (m_mPlc.point_array[i][n]!=NULL)
				m_mPlc.remove_point(i,n);
		}
}

void CLADDoc::SetRowCol(int row, int col)
{
	Rows=row;
	Cols=col;
	m_mPlc.SetRowCol(row,col);
}

void CLADDoc::DeletePoints()
{
	for (int i=0;i<m_pointArray.GetSize();i++)
	{
		delete m_pointArray.GetAt(i);
	}
	m_pointArray.RemoveAll();
}


⌨️ 快捷键说明

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