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 + -
显示快捷键?