node.cpp

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

CPP
1,504
字号
// node.cpp: implementation of the node class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "richtest.h"
#include "node.h"
#include "datastructuredlg.h"
#include "myview.h"
#define lth 25
#define SNAPDIPAN 1
#define SNAPCON   2
#define SNAPIN   4
#define SNAPOUT   8
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern dpt rspt;
extern double g_scale;
extern double  g_c_scale;
extern BOOL bmove;
extern dpt offset;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSize operator*(CSize size,double scale)
{	size.cx*=scale;
	size.cy*=scale;
	
	return size;
};
CSize operator/(CSize size,double scale)
{	size.cx/=scale;
	size.cy/=scale;
	
	return size;
};
ptlist::ptlist()
{
head=tail=pdpt=NULL;cnt=0;
}

ptlist::~ptlist()
{dpt* p;
	pdpt=head;
	while(pdpt!=NULL)
	{p=pdpt->next;
	delete pdpt;
	pdpt=p;
	}
}

BOOL ptlist::add(dpt* pdptin)
{	
	if(pdptin==NULL)
	return FALSE;
	if(head==NULL)
	{
	head=pdpt=tail=pdptin;
	}
	else
	{
	tail->next=pdptin;
	tail=pdptin;
	tail->pre=pdpt;
	pdpt=tail;
	}
	cnt++;
	return TRUE;
}
void ptlist::operator =(ptlist &in)
{	head=in.head;
	pdpt=head;
	in.pdpt=in.head;
	while(in.pdpt!=NULL)
	{
		in.pdpt=in.pdpt->next;
		pdpt->next=in.pdpt;
		pdpt=pdpt->next;
	
	}
}
void ptlist::operator =(ptlist *in)
{	*this=*in;
}
node::node()
{	par=NULL;
	cmd_id=-1;
	cmd_level=-1;
	infreecnt=0;
	type=basic;
	// runinfo=new char[1000];
	runinfolth=1000;
	pthrd=NULL;
	m_hThread=NULL;
	grade=-1;
	nextcon=new ndlist[5];
	this->pnode=NULL;
	bselect=FALSE;
	invalidcnt=0;
	bwait=TRUE;
bfrosen=FALSE;
frosencnt=0;
infrosencnt=0;
binfrosen=NULL;
binvalid=NULL;
boutfrosen=NULL;
boutvalid=FALSE;
pptlist=NULL;
for(unsigned int i=0;i<5;i++)
bconfrosen[i]=FALSE;
for(i=0;i<5;i++)
bconinfrosen[i]=FALSE;
	scale=1;
	back=CSize(0,0);
	dipan=drec(-1,-1,-1,-1);
	incnt=1;
	outcnt=1;
	concnt=3;
	pre=NULL;
	prepin=NULL;
	area=drec(-1,-1,-1,-1);
	prerelation=NULL;
	precnt=0;
	next=NULL;
	nextcnt=0;
	pcmd=NULL;
	incenter=NULL;
	outcenter=NULL;	
	ppn=NULL;
	pnn=NULL;
	//poutnn=NULL;
//	poutpn=NULL;
	pfile=NULL;
	pstructure=NULL;
	pfirst=NULL;
}
node::node(void* pnode)
{node();
	this->pnode=pnode;
}

node::~node()
{//if(runinfo!=NULL)
//	delete[] runinfo;
if(concnt>0)
delete[] nextcon;
delete[] pre;
if(prepin!=NULL)
delete[] prepin;
if(prerelation!=NULL)
delete[] prerelation;
if(next!=NULL)
delete[] next;
if(incenter!=NULL)
delete[] incenter;
if(outcenter!=NULL)
delete[] outcenter;
if(binfrosen!=NULL)
	delete[] binfrosen;
if(binvalid!=NULL)
	delete[] binvalid;
if(boutfrosen!=NULL)
	delete[] boutfrosen;
if(pptlist!=NULL)
	delete[] pptlist;
if(pstructure!=NULL)
	delete[] pstructure;
}
void node::upgrade(int g)
{
for(unsigned int i=0;i<outcnt;i++)
{
	next[i].upgrade(g);

}
}
typedef int(_stdcall ppp)(void*);
UINT address(void*)
{
	return 0;
}
UINT proc(void* vp)
{
	node* pn=(node*)vp;
	pn->invalidcnt=-1;
	pn->run();
	return 0;
}
UINT node::run()
{
	//int hr=pcmd->go(funcnumber,&in,&out);

	node* pn;
	for(unsigned int i=0;i<outcnt;i++)
	{	nd* pnd=next[i].head;
		while(pnd!=NULL)
		{
		pn=(node*)pnd->p;
		if(pn->bwait==TRUE)
		{	
		//	pn->in[pnd->which]=out[i];
			if(++pn->invalidcnt==pn->incnt-pn->infreecnt)
			{	pn->pv=pv;
				pn->pmv=pmv;
				pn->pthrd=AfxBeginThread(proc,pn);
				pn->pthrd->m_bAutoDelete=FALSE;
				pn->m_hThread=pthrd->m_hThread;
			}

		}
		else
			return FALSE;
		pnd=pnd->next;
		}
	}
finishflag(pv);
return 0;
}

mydata* node::prepare(double *in, unsigned int cnt)
{
	mydata * pit=new mydata;
	pit->set_data(NULL,0,type_dou,cnt,in);
	return pit;
}
mydata* node::prepare(mwArray *in, unsigned int cnt)
{

	mydata * pit=new mydata;
	pit->mset_data(NULL,0,type_mw,NULL,NULL,cnt,in);
	return pit;
}
mydata* node::prepare(mydata *in, unsigned int cnt)
{
	return in;
}
/*BOOL node::is_snap(const CPoint &point)
{
if(dipan.PtInRect(point))
{	frenew=TRUE;
	return TRUE;
}
	return FALSE;
}
*/
void node::draw(CView* pv,CDC* pDC)
{	CPen* pNewPen=new CPen;
	pNewPen->CreatePen(0,5,RGB(100,100,150));	
	CPen* oldpen=pDC->SelectObject(pNewPen);
	CPen* pPen1=new CPen;
	char charid[4];
	sprintf(charid,"%d",grade);
	pDC->TextOut(center.x,center.y,charid,1);
	pPen1->CreatePen(0,2,RGB(50,50,255));
	pDC->SelectObject(pPen1);
	for(unsigned int i=0;i<incnt;i++)
	{//	pv->ScreenToClient(&inleft[i]);
	//	pv->ScreenToClient(&inright[i]);
	//	pv->ScreenToClient(&inrect[i]);
		pDC->MoveTo(inleft[i].x,inleft[i].y);//左面
		pDC->LineTo(inright[i].x,inright[i].y);
		pDC->Ellipse(inrect[i].left,inrect[i].top,inrect[i].right,inrect[i].bottom);
		if(binfrosen!=NULL)
		{if(binfrosen[i])
				this->pptlist[i].draw(pDC);
		}
	//	pDC->MoveTo(inrect[i].left*3/4+inrect[i].right/4,inrect[i].top*0.93+inrect[i].bottom*0.07);
	//	pDC->LineTo(inrect[i].left*3/4+inrect[i].right/4,inrect[i].top*0.07+inrect[i].bottom*0.93);
	//	pDC->LineTo(inrect[i].right,inrect[i].top*.5+inrect[i].bottom*.5);
	//	pDC->LineTo(inrect[i].left*3/4+inrect[i].right/4,inrect[i].top*0.93+inrect[i].bottom*0.07);
	}
	delete pPen1;
	pPen1=new CPen;
	pPen1->CreatePen(0,2,RGB(50,255,50));
	pDC->SelectObject(pPen1);
	for(i=0;i<outcnt;i++)
	{//	pv->ScreenToClient(&outleft[i]);
	//	pv->ScreenToClient(&outright[i]);
	//	pv->ScreenToClient(&outrect[i]);
		pDC->MoveTo(outleft[i].x,outleft[i].y);//左面
		pDC->LineTo(outright[i].x,outright[i].y);
		pDC->Ellipse(outrect[i].left,outrect[i].top,outrect[i].right,outrect[i].bottom);
	}
	pPen1=new CPen;
	pPen1->CreatePen(0,2,RGB(255,50,50));
	pDC->SelectObject(pPen1);
	for(i=0;i<concnt;i++)
	{
	//	pv->ScreenToClient(&contop[i]);
	//	pv->ScreenToClient(&conbottom[i]);
	//	pv->ScreenToClient(&conrect[i]);
		pDC->MoveTo(contop[i].x,contop[i].y);//右面
		pDC->LineTo(conbottom[i].x,conbottom[i].y);
		pDC->Ellipse(conrect[i].left,conrect[i].top,conrect[i].right,conrect[i].bottom);
		if(bconinfrosen[i])
				this->ptlstcon[i].draw(pDC);
	}
	pPen1=new CPen;
	pPen1->CreatePen(0,2,RGB(128,127,05));
	pDC->SelectObject(pPen1);
	for(i=0;i<concnt;i++)
	{//	pv->ScreenToClient(&contop[i+5]);
	//	pv->ScreenToClient(&conbottom[i+5]);
	//	pv->ScreenToClient(&conrect[i+5]);
		pDC->MoveTo(contop[i+5].x,contop[i+5].y);//右面
		pDC->LineTo(conbottom[i+5].x,conbottom[i+5].y);
		pDC->Ellipse(conrect[i+5].left,conrect[i+5].top,conrect[i+5].right,conrect[i+5].bottom);
	}
	delete pPen1;
	pDC->SelectObject(pNewPen);	
//	pv->ScreenToClient(&dipan);
//	pv->ScreenToClient(&area);
	pDC->MoveTo(dipan.left,dipan.top);
		pDC->LineTo(dipan.right,dipan.top);
		pDC->LineTo(dipan.right,dipan.bottom);
		pDC->LineTo(dipan.left,dipan.bottom);
		pDC->LineTo(dipan.left,dipan.top);
//	pDC->MoveTo(area.left,area.top);
//		pDC->LineTo(area.right,area.top);
//		pDC->LineTo(area.right,area.bottom);
//		pDC->LineTo(area.left,area.bottom);
//		pDC->LineTo(area.left,area.top);
	delete pNewPen;
if(!bmove)	
{pNewPen=new CPen;;
	pNewPen->CreatePen(0,1,RGB(255,255,255));
	pDC->SelectObject(pNewPen);	
		//int nDrawMode=pDC->SetROP2(R2_NOT);//设置R2_NOT的绘图方式
		pDC->MoveTo(dipan.left/2+dipan.right/2,dipan.top);
		pDC->LineTo(dipan.left/2+dipan.right/2,dipan.bottom);
		pDC->MoveTo(dipan.left,dipan.top/2+dipan.bottom/2);
		pDC->LineTo(dipan.right,dipan.top/2+dipan.bottom/2);//覆盖先前的光标线

	//	pDC->SetROP2(nDrawMode);
		
	delete pNewPen;
}
}

BOOL node::create(myview* pmv,CView* pv,dpt &point)
{this->pv=pv;
this->pmv=pmv;
CRect rect;	
//pv->ClientToScreen(&rect);
	center=point;//-CPoint(rect.left,rect.top);
//CPoint temp2=(point-rspt)*g_scale+rspt;
CSize bag=CPoint(0,0);//center-temp2;
//center=temp2;
		dpt temp,temp1;
		for(unsigned int i=0;i<incnt;i++)
	{
			temp=dpt(center.x-lth*scale*3/2*g_c_scale,\
		center.y+(lth*2.0000/(incnt+1.0000)*(i+1.0000)-lth)*scale*g_c_scale);
		incenter[i]=temp;
		temp=dpt(incenter[i].x+lth/6*scale*g_c_scale,incenter[i].y);
		inleft[i]=temp;	
		temp=dpt(incenter[i].x+lth/2*scale*g_c_scale,incenter[i].y);
		inright[i]=temp;
		dipan.left=temp.x;
		temp=dpt(incenter[i].x-lth/6*g_c_scale,incenter[i].y-lth/6*g_c_scale);
		temp1=dpt(incenter[i].x+lth/6*g_c_scale,incenter[i].y+lth/6*g_c_scale);
		inrect[i]=drec(temp,temp1);			
		area.left=temp.x-2;
	}
	if(outcnt==0&&concnt==0)
	{
		dipan.right=center.x+center.x-dipan.left;
		area.right=2*center.x-area.left;
		dipan.bottom=center.y+center.x-dipan.left;
		area.bottom=center.y-center.x+area.left;
		dipan.top=center.y-center.x+dipan.left;
		area.top=center.y+center.x-area.left;
		goto goon;
	}

	for(i=0;i<outcnt;i++)
	{	temp=dpt(center.x+3*lth*scale/2*g_c_scale,\
		center.y+(lth*2.0/(outcnt+1.0)*(i+1.0)-lth)*scale*g_c_scale);
		outcenter[i]=temp;
		temp=dpt(outcenter[i].x-lth/6*scale*g_c_scale,outcenter[i].y);
		outleft[i]=temp;		
		temp=dpt(outcenter[i].x-lth/2*scale*g_c_scale,outcenter[i].y);
		outright[i]=temp;
		dipan.right=temp.x;
		temp=dpt(outcenter[i].x-lth/6*g_c_scale,outcenter[i].y-lth/6*g_c_scale);
		temp1=dpt(outcenter[i].x+lth/6*g_c_scale,outcenter[i].y+lth/6*g_c_scale);
		outrect[i]=drec(temp,temp1);		
		area.right=temp1.x+2;
	}
	if(concnt==0&&incnt==0)
	{
		dipan.left=2*center.x-dipan.right;
		area.left=2*center.x-area.right;
		dipan.bottom=center.y-center.x+dipan.right;
		area.bottom=center.y-center.x+area.right;
		dipan.top=center.y+center.x-dipan.right;
		area.top=center.y+center.x-area.right;
		goto goon;
	}
	for(i=0;i<concnt;i++)
	{	temp=dpt(center.x-lth*scale*g_c_scale+lth*2/(concnt+1)*(i+1)*scale*g_c_scale,\
		center.y-lth*scale*3/2*g_c_scale);
		concenter[i]=temp;
		temp=dpt(concenter[i].x,concenter[i].y+lth/6*scale*g_c_scale);
		contop[i]=temp;//上面
		temp=dpt(concenter[i].x,concenter[i].y+lth/2*scale*g_c_scale);
		conbottom[i]=temp;
		dipan.top=temp.y;
		temp=dpt(concenter[i].x-lth/6*scale*g_c_scale,\
				concenter[i].y-lth/6*scale*g_c_scale);
		temp1=dpt(concenter[i].x+lth/6*scale*g_c_scale,\
			concenter[i].y+lth/6*scale*g_c_scale);
		conrect[i]=drec(temp,temp1);
		area.top=temp.y-2;
	}
	for(i=0;i<concnt;i++)
	{	temp=dpt(center.x-lth*scale*g_c_scale+lth*2/(concnt+1)*(i+1)*scale*g_c_scale,\
		center.y+lth*3*scale/2*g_c_scale);
		concenter[i+5]=temp;
		temp=dpt(concenter[i+5].x,concenter[i+5].y-lth/6*scale*g_c_scale);
		contop[i+5]=temp;//下面
		temp=dpt(concenter[i+5].x,concenter[i+5].y-lth/2*scale*g_c_scale);
		conbottom[i+5]=temp;
		dipan.bottom=temp.y;
		temp=dpt(concenter[i+5].x-lth/6*scale*g_c_scale,\
			concenter[i+5].y-lth/6*scale*g_c_scale);
		temp1=dpt(concenter[i+5].x+lth/6*scale*g_c_scale,
			concenter[i+5].y+lth/6*scale*g_c_scale);
		conrect[i+5]=drec(temp,temp1);
		area.bottom=temp1.y+2;
	}

	/*	CPoint temp,temp1;
	for(unsigned int i=0;i<incnt;i++)
	{	temp=CPoint(center.x-lth*scale*3/2,center.y+(lth*2/(incnt+1)*(i+1)-lth)*scale);
		incenter[i]=rspt+(temp-rspt)*g_scale+offset;
		temp=CPoint(incenter[i].x+lth/6*scale,incenter[i].y);
		inleft[i]=(temp-rspt)*g_scale+rspt+offset+bag;		
		temp=CPoint(incenter[i].x+lth/2*scale,incenter[i].y);
		inright[i]=(temp-rspt)*g_scale+rspt+offset+bag;		
		dipan.left=((temp-rspt)*g_scale+rspt+offset+bag).x;
		temp=CPoint(incenter[i].x-lth/6,incenter[i].y-lth/6);
		temp1=CPoint(incenter[i].x+lth/6,incenter[i].y+lth/6);
		inrect[i]=CRect((temp-rspt)*g_scale+rspt+offset+bag,(temp1-rspt)*g_scale+rspt+offset+bag);			
		area.left=((temp-rspt)*g_scale+rspt+offset+bag).x-2;
	}
	for(i=0;i<outcnt;i++)
	{	temp=CPoint(center.x+3*lth*scale/2,center.y+(lth*2/(outcnt+1)*(i+1)-lth)*scale);
		outcenter[i]=rspt+(temp-rspt)*g_scale;
		temp=CPoint(outcenter[i].x-lth/6*scale,outcenter[i].y);
		outleft[i]=rspt+(temp-rspt)*g_scale+offset+bag;		
		temp=CPoint(outcenter[i].x-lth/2*scale,outcenter[i].y);
		outright[i]=rspt+(temp-rspt)*g_scale+offset+bag;
		dipan.right=(rspt+(temp-rspt)*g_scale+offset+bag).x;
		temp=CPoint(outcenter[i].x-lth/6,outcenter[i].y-lth/6);
		temp1=CPoint(outcenter[i].x+lth/6,outcenter[i].y+lth/6);
		outrect[i]=CRect((temp-rspt)*g_scale+rspt+offset+bag,(temp1-rspt)*g_scale+rspt+offset+bag);		
		area.right=((temp1-rspt)*g_scale+rspt+offset+bag).x+2;
	}
	for(i=0;i<concnt;i++)
	{	temp=CPoint(center.x-lth*scale+lth*2/(concnt+1)*(i+1)*scale,center.y-lth*scale*3/2);
		concenter[i]=rspt+(temp-rspt)*g_scale;
		temp=CPoint(concenter[i].x,concenter[i].y+lth/6*scale);
		contop[i]=rspt+(temp-rspt)*g_scale+offset+bag;//上面
		temp=CPoint(concenter[i].x,concenter[i].y+lth/2*scale);
		conbottom[i]=rspt+(temp-rspt)*g_scale+offset+bag;
		dipan.top=(rspt+(temp-rspt)*g_scale+offset+bag).y;
		temp=CPoint(concenter[i].x-lth/6*scale,concenter[i].y-lth/6*scale);
		temp1=CPoint(concenter[i].x+lth/6*scale,concenter[i].y+lth/6*scale);
		conrect[i]=CRect((temp-rspt)*g_scale+rspt+offset+bag,(temp1-rspt)*g_scale+rspt+offset+bag);
		area.top=((temp-rspt)*g_scale+rspt+offset+bag).y-2;
	}
	for(i=0;i<concnt;i++)
	{	temp=CPoint(center.x-lth*scale+lth*2/(concnt+1)*(i+1)*scale,center.y+lth*3*scale/2);
		concenter[i+5]=rspt+(temp-rspt)*g_scale;
		temp=CPoint(concenter[i+5].x,concenter[i+5].y-lth/6*scale);
		contop[i+5]=rspt+(temp-rspt)*g_scale+offset+bag;//下面
		temp=CPoint(concenter[i+5].x,concenter[i+5].y-lth/2*scale);
		conbottom[i+5]=rspt+(temp-rspt)*g_scale+offset+bag;
		dipan.bottom=(rspt+(temp-rspt)*g_scale+offset+bag).y;
		temp=CPoint(concenter[i+5].x-lth/6*scale,concenter[i+5].y-lth/6*scale);
		temp1=CPoint(concenter[i+5].x+lth/6*scale,concenter[i+5].y+lth/6*scale);
		conrect[i+5]=CRect((temp-rspt)*g_scale+rspt+offset+bag,(temp1-rspt)*g_scale+rspt+offset+bag);
		area.bottom=((temp1-rspt)*g_scale+rspt+offset+bag).y+2;
	}*/
goon:
return TRUE;
}

void node::rs(CDC* pDC)
{/*	CPoint temp,temp1;
	CPen* pNewPen=new CPen;
	pNewPen->CreatePen(0,5,RGB(100,100,150));	
	CPen* oldpen=pDC->SelectObject(pNewPen);
	CPen* pPen1=new CPen;
	pPen1->CreatePen(0,2,RGB(50,50,255));
	pDC->SelectObject(pPen1);
	for(unsigned int i=0;i<incnt;i++)

⌨️ 快捷键说明

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