mygraph.cpp

来自「故障诊断工作涉及的领域相当广泛」· C++ 代码 · 共 1,115 行 · 第 1/2 页

CPP
1,115
字号
// mygraph.cpp: implementation of the mygraph class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "richtest.h"
#include "mygraph.h"
#include "cadview.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define RBUTTONDOWN 2
#define SNAPDIPAN 2
#define SNAPIN   4
#define SNAPOUT   8
#define SNAPCONIN   16
#define SNAPCONOUT   32
#define DRAWDATA     64
#define DRAWCON     128
#define SELECTNODE     4096
#include "moudledlg.h"
UINT proc(void* vp);
extern dpt rspt;
extern dpt offset;
extern int g_c_flag;
extern double g_scale;
extern double g_c_scale;
extern node* g_pn;
extern int whichin;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CView* pcadview;
mygraph::mygraph()
{	dipan=CRect(0,0,0,0);
	bvalid=FALSE;
	empty=TRUE;
	runinfolth=0;
	runinfo=NULL;
	bfirstmove=FALSE;
	innodecnt=0;outnodecnt=0;
	pflag=0;
	bway=0;
	bwaystart=FALSE;
	g_c_flag=0;
	pn1=NULL;
	bway=FALSE;
	pptlst=NULL;
	bselecting=FALSE;
pn2=NULL;
which1=-1;
which2=-1;
bmove=FALSE;
type=mapnone;
dipan=CRect(-1,-1,-1,-1);
frenew=TRUE;
incnt=0;
//in=NULL;
//out=NULL;
outcnt=0;
head=NULL;
pn=NULL;
tail=NULL;
nodecnt=0;
stepg=0;
}

mygraph::~mygraph()
{
	if(runinfo!=NULL)
		delete[] runinfo;	
	node* temp;
	if(head!=0)
	{node* pn=head;
	while(pn!=NULL)
	{
		temp=pn->pnn;
		if(pn->pthrd!=NULL)
			delete pn->pthrd;
		delete pn;
		pn=temp;
	}
	}
}
double mygraph::calculate(double in)
{
return 0;
};
 _declspec(dllexport) void operator <<(CArchive& ar,mygraph& it)
{	ar<<it.empty;
if(!it.empty)
{ ar<<it.runinfolth;
	for(unsigned int i=0;i<it.runinfolth;i++)
	{
		ar<<it.runinfo[i];
	}
	ar<<it.bvalid;
	ar<<(int)it.type;
	ar<<it.frenew;
	ar<<it.dipan;
	ar<<it.nodecnt;
	ar<<it.innode;
	it.pn=it.head;
	while(it.pn!=NULL)
	{
		ar<<*(it.pn);
		it.pn=it.pn->pnn;
	}
}
	
}
  _declspec(dllexport) void operator >>(CArchive& ar,mygraph& it)
  {	 ar>>it.empty;
  if(!it.empty)
	{
		ar>>it.runinfolth;
		it.runinfo=new char[it.runinfolth+1];
		for(unsigned int i=0;i<it.runinfolth;i++)
		{
		ar>>it.runinfo[i];
		}
		it.runinfo[i]=0;
		ar>>it.bvalid;
		int bag;
		ar>>bag;
		it.type=(map_type)bag;
		ar>>it.frenew;
		ar>>it.dipan;
		ar>>it.nodecnt;
		ar>>it.innode;
		for(i=0;i<it.nodecnt;i++)
		{
		it.pn=new node;
		ar>>*(it.pn);
		if(i==0)
			it.tail=it.head=it.pn;
		else
		{
			it.pn->ppn=it.tail;
			it.tail->pnn=it.pn;
			it.tail=it.pn;
		}

		}
	it.rebuildpath();
  }
int cccc=0;	
}
_declspec(dllexport) void mygraph::Serialize(CArchive&  ar)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CObject::Serialize(ar);
if(ar.IsStoring())
 ar<<*this;
else
{
	ar>>*this;
	

}
}
void mygraph::operator =(mygraph &in)
{
type=in.type;
frenew=in.frenew;
dipan=in.dipan;
}
/*BOOL mygraph::is_snap(const CPoint &point)
{
if(dipan.PtInRect(point))
{	frenew=TRUE;
	return TRUE;
}
	return FALSE;
}
*/
void mygraph::draw_area(CDC *pdc,BOOL visible)
{
	if(visible)
	{
		pdc->MoveTo(dipan.left,dipan.top);
		pdc->LineTo(dipan.left,dipan.bottom);
		pdc->LineTo(dipan.right,dipan.bottom);
		pdc->LineTo(dipan.right,dipan.top);
		pdc->LineTo(dipan.left,dipan.top);
	}

}

void mygraph::draw(CView* pv,CDC *pDC,BOOL visible)
{
				node* pn;
				pn=head;
				unsigned long bkcolor= pDC->GetBkColor();
				CPen* pNewPen=new CPen;
				pNewPen->CreatePen(0,5,bkcolor);	
				CPen* oldpen=pDC->SelectObject(pNewPen);
				while(pn!=NULL)
				{
					pn->draw(pv,pDC);
					pn=pn->pnn;
				}		
}

void mygraph::renew(CDC *pDC, const CPoint point)
{

}

void mygraph::renew_graph(CDC *pDC, CPoint point)
{

}

void mygraph::renew_node(CDC *pDC, const CPoint point)
{

}

int mygraph::snaped(CCadView *pcadview,CPoint point,node** p,BOOL bway,int* pw)
{dpt pt(point);
int which;
BOOL conflag,flag=FALSE;
	node* pn=head;
	while(pn!=NULL)
	{conflag=pn->is_con_snap(pt,&which);
		if(pn->is_dipan_snap(pt))
		{if(pn->bfrosen==false)
			{pn->setdipan(pcadview);
			 *p=pn;
			return SNAPDIPAN;
			}
		return TRUE;
		}
		else if(conflag==1)
		{
			if(pn->bconinfrosen[which-pn->incnt-pn->outcnt]==FALSE)//输入端不存在连接
			{	pn2=pn;
				*p=pn;
				which2=which;
				*pw=which2;
				if(stepg==1)
				{
					stepg=0;							
				}
				else
				{
					stepg=1;				
				}
				return SNAPCONIN|DRAWCON;
			}
			else// if(stepg==0)//输入控制端存在连接
			{	pn2=pn;
				*p=pn;//记录当前节点
				which2=which;//当前的输入针脚号码
				*pw=which2;//当前的输入针脚号码
				CDC* pDC=pcadview->GetDC();				
				pn->ptlstcon[which-pn->incnt-pn->outcnt].setpath(pDC);//设置输入路径
				pn1=(node*)(pn2->precon[which2-pn2->incnt-pn2->outcnt].p);//输入数据来自于哪一个节点
				stepg=2;
				return SNAPCONIN|DRAWCON;
			}
		}
		else if(conflag==2)
		{		pn1=pn;
				*p=pn;
				which1=which;
				*pw=which1;
			if(stepg==1)
			{
				stepg=0;
			}
			else
			{
				stepg=1;
			}
			return SNAPCONOUT|DRAWCON;
		}		
		else if(pn->is_in_snap(pt,&which))
		{
			
			if(pn->binfrosen[which]==FALSE)//输入端不存在连接
			{	pn2=pn;
				*p=pn;
				which2=which;
				*pw=which2;
				if(stepg==1)
				{
					stepg=0;							
				}
				else
				{
					stepg=1;				
				}
				return SNAPIN|DRAWDATA;
			}
			else if(stepg!=1)//输入端存在连接
			{	pn2=pn;
				*p=pn;//记录当前节点
				which2=which;//当前的输入针脚号码
				*pw=which2;//当前的输入针脚号码
				CDC* pDC=pcadview->GetDC();				
				pn->pptlist[which].setpath(pDC);//设置输入路径
				pn1=(node*)(pn2->pre[which2].p);//输入数据来自于哪一个节点
				stepg=2;
				return SNAPIN|DRAWDATA;
			}
		}	
		else if(pn->is_out_snap(pt,&which))
		{		pn1=pn;
				*p=pn;
				which1=which;
				*pw=which1;
			if(stepg==1)
			{
				stepg=0;
			}
			else
			{
				stepg=1;
			}
			return SNAPOUT|DRAWDATA;
		}
		else if(!flag)
		{			
			flag=pn->is_snap(pt,bway);
			if(flag)
				g_pn=pn;
		}
	pn=pn->pnn;
	}
	return flag;
}
void mygraph::change(short zDelta)
{				
	if(zDelta>0)
		g_scale=1.2;
	else if(zDelta<0)
		g_scale=1/1.2;
	if(zDelta>0)
		g_c_scale*=1.2;
	else if(zDelta<0)
		g_c_scale/=1.2;
	pn=head;
	while(pn!=NULL)
	{	pn->change();
		pn=pn->pnn;
	}		
}

void mygraph::move()
{
pn=head;
while(pn!=NULL)
	{	pn->move();
		pn=pn->pnn;
	}		
}

void mygraph::see()
{
pn=head;
while(pn!=NULL)
	{	pn->change();
		pn=pn->pnn;
	}
rspt+=offset;
pn=head;
while(pn!=NULL)
	{	pn->move();
		pn=pn->pnn;
	}				
}

void mygraph::cutdataconection()
{		if(pn1->pfirst!=NULL&&pn1->type==indata&&pn1->pfirst==pn2&&pn1->next[0].cnt>pn2->incnt)
			goto goon;
		pn1->next[pn2->prepin[which2]-pn1->incnt].remove(pn2->number);//删除所选择的接受节点输出数数据的节点(以号码判断)
		pn1->frosencnt--;
		if(pn1->frosencnt==0)
			pn1->bfrosen=FALSE;
		pn2->binfrosen[which2]=FALSE;
		pn2->pre[which2].p=NULL;
		pn2->pre[which2].index=-1;
		pn2->prepin[which2]=NULL;
		if(--pn2->frosencnt==0)
			pn2->bfrosen=FALSE;
		--(pn2->infrosencnt);	
		pn2->infreecnt++;
		if(pn1->frosencnt==0&&pn1->pstructure!=NULL&&pn1->type==indata)
		{
			delete[] pn1->pstructure;
			pn1->pstructure=NULL;
			pn1->pfirst=NULL;
		}
		degrade(pn1,pn2);
goon:
		int ccc=0;
}
void mygraph::cutconconection()
{	
		pn1->nextcon[pn2->preconpin[which2-pn1->incnt-pn1->outcnt]-pn1->incnt-pn1->outcnt-5].remove(pn2->number);//删除所选择的接受节点输出数数据的节点(以号码判断)
		pn1->frosencnt--;
		if(pn1->frosencnt==0)
			pn1->bfrosen=FALSE;
		pn2->bconinfrosen[which2-pn2->incnt-pn2->outcnt]=FALSE;	
		pn2->precon[which2-pn2->incnt-pn2->outcnt].p=NULL;
		pn2->precon[which2-pn2->incnt-pn2->outcnt].index=-1;
		pn2->preconpin[which2-pn2->incnt-pn2->outcnt]=NULL;
		pn2->frosencnt--;
		if(pn2->frosencnt==0)
			pn2->bfrosen=FALSE;
			
}
void mygraph::lbuttondown(CCadView* pv,UINT nFlags, CPoint point)
{		int pw;
		int flag=stepg;
		rect.left=point.x;
		rect.top=point.y;
		g_c_flag=snaped(pv,point,&pn,FALSE,&pw);
		if(g_c_flag&SNAPDIPAN)
			{
				first=dpt(point);
				bfirstmove=TRUE;
			}
	//	else
	//		stepg=flag;
int c=0;			
}	
void mygraph::lbuttonup(CCadView* pv,UINT nFlags, CPoint point)
{dpt cpt;int uuuu;

			int pw;
			CDC *pDC=pv->GetDC();
			if(oldstepg==2&&pflag&SNAPIN)
			{	clearflag(pv);
				pv->frcdraw();
				return;
			}
			if(bselecting==TRUE)
			{
				rect.right=point.x;
				rect.bottom=point.y;
				if(abs((first.x-point.x)*(first.y-point.y))>100)
					selectrect(rect,pv);
				bselecting==FALSE;
				goto goon;
			}
			if(g_c_flag&SNAPDIPAN&&pn->bfrosen==FALSE)
					{	dpt bag=dpt(point.x-first.x,point.y-first.y);
						if(isoverlap(pn,dpt(point))==FALSE)
						{	
							pn->move(bag);
						}
						if(bag.x!=0.0||bag.y!=0.0)
						{pv->frcdraw();
							g_c_flag-=SNAPDIPAN;
							pflag=0;
						}						
						goto goon;
					}				
				if(1/*g_scale==1.0*/)
				{	
				if(bway)
					g_c_flag=snaped(pv,point,&pn,TRUE,&pw);
				else
					g_c_flag=snaped(pv,point,&pn,FALSE,&pw);
				
			uuuu=1;	
					if(g_c_flag!=0)
					{
						if(g_c_flag&SNAPDIPAN)
						{
							first=dpt(point);
						goto goon;	
						};
						if(g_c_flag&SNAPIN)
						{if(pflag&SNAPOUT)
							{	nd* p=pn1->next[which1-pn1->incnt].head;
								if(p!=NULL)
								for(unsigned v=0;v<which2;v++)
								{uuuu=p->which;
								p=p->next;
								}
								if(pn1->pfirst!=NULL&&pn1->pfirst->infrosencnt<pn1->pfirst->incnt&&pn2!=pn1->pfirst)
								goto goon;
							}
							if(pflag&SNAPIN||pflag&SNAPCONIN||pflag&SNAPCONOUT)
							{
								goto goon;
							}
							else if(pflag&SNAPOUT)
							{
								pn2=pn;
								which2=pw;
								if(pn1!=pn2)
								{if(gradeerror(pn1,pn2))
										goto goon;
								}
								if(abs(pptlst->tail->y-point.y)>5)
								pptlst->tail->x=point.x-5;
								dpt* pdpt=new dpt;
								*pdpt=dpt(point.x-5,point.y);
								pptlst->add(pdpt);
								finishiopath(pv,point,pDC);
								goto skip;
							}							 
							else if(stepg==0)
							{	pn2=pn;
								which2=pw;
								dpt* pdpt1=new dpt;
								beginpath(pv,point,pDC);
								*pdpt1=dpt(first.x-5,first.y);
								pptlst->add(pdpt1);
							}
						}
						else if(g_c_flag&SNAPOUT)
						{
							if(pflag&SNAPIN)
							{	nd* p=pn1->next[which1-pn1->incnt].head;
								if(p!=NULL)
								for(unsigned v=0;v<which2;v++)
								{uuuu=p->which;
								p=p->next;
								}
								if(pn1->pfirst!=NULL&&pn1->pfirst->infrosencnt<pn1->pfirst->incnt&&pn2!=pn1->pfirst)
								goto goon;
							}
							if(pflag&SNAPOUT||pflag&SNAPCONIN||pflag&SNAPCONOUT)
							{
								goto goon;
							}
							else if(pflag&SNAPIN)
							{	
								pn1=pn;
								which1=pw;
								if(pn1!=pn2)
								{
									if(gradeerror(pn1,pn2))
										goto goon;
								}
								if(abs(pptlst->tail->y-point.y)>5)
								pptlst->tail->x=point.x+5;
								dpt* pdpt=new dpt;
								*pdpt=dpt(point.x+5,point.y);
								pptlst->add(pdpt);
								finishiopath(pv,point,pDC);
								goto skip;
							}
							else if(stepg==0)
							{	
								pn1=pn;
								which1=pw;
								beginpath(pv,point,pDC);
								dpt* pdpt1=new dpt;
								*pdpt1=dpt(first.x+5,first.y);

⌨️ 快捷键说明

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