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