📄 weightinput.cpp
字号:
strSql.Format(str,m_strVexTail);
m_pRecordset->Open(strSql.AllocSysString(),_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
_variant_t vOrderNum;
while(!m_pRecordset->adoEOF)
{
vOrderNum = m_pRecordset->GetCollect("id");
strId=vOrderNum.iVal;
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
}
catch(_com_error e){
AfxMessageBox(e.ErrorMessage());
}*/
int row1=locateVex(Net,m_strVexTail);
int column1=locateVex(Net,m_strVexHead);
if(row1!=-1&&column1!=-1)
{
Net.arcs[row1][column1].fengZu=m_fengZu;
Net.arcs[row1][column1].fengLiang=m_fengLiang;
G.arcs[row1][column1].fengZu=G.arcs[column1][row1].fengZu=1;
Net.arcs[row1][column1].xieLv=m_xieLv;
Net.arcs[row1][column1].fengYa=m_fengYa;
}
else { //输入点有不是图中的节点;报错
return;
}
int intfzlxRadio=GetCheckedRadioButton(IDC_RADIOFJ,IDC_RADIOYB);
if(IDC_RADIOFJ==intfzlxRadio)//分支类型,风机
{
Net.arcs[row1][column1].intArcType=0;
G.arcs[row1][column1].intArcType=0;
m_leiXing=0;
}
else
if(intfzlxRadio==IDC_RADIOGD)//分支类型,固定
{
Net.arcs[row1][column1].intArcType=1;
G.arcs[row1][column1].intArcType=1;
m_leiXing=1;
}
else //分支类型,一般
{
Net.arcs[row1][column1].intArcType=2;
G.arcs[row1][column1].intArcType=2;
m_leiXing=2;
}
}
void CWeightInput::OnInsert()
{
// TODO: Add your control notification handler code here
UpdateData(true);
//在图中查找头结点和尾结点
////应该判断插入的巷道是否存在????????????????????
/*if(listCount=Net.arcNum)
{
//CDialog::OnOK();
AfxMessageBox("巷道信息已经输入完毕!\r\n不能再输入!",MB_OK);
return;
}*/
initNet(); //插入记录
CString str,strSql;
str="insert into netDiagram(arcTail,arcHead,fengZu,fengLiang,leiXing,fengYa,xieLv) values (%s,%s,%f,%f,%f,%d,%f)";
strSql.Format(str,m_strVexTail,m_strVexHead,m_fengZu,m_fengLiang,m_leiXing,m_fengYa,m_xieLv);
theApp.m_pConnection->Execute(strSql.AllocSysString(),NULL,adOptionUnspecified);
//插入的记录显示到list中
/* try {
m_pRecordset->Open("SELECT * FROM netDiagram",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
int nItem;
m_list.DeleteAllItems();
while(!m_pRecordset->adoEOF)
{
vArcTail = m_pRecordset->GetCollect("arcTail");
vArcHead = m_pRecordset->GetCollect("arcHead");
vFengLiang = m_pRecordset->GetCollect("fengLiang");
vFengYa = m_pRecordset->GetCollect("fengYa");
vFengZu=m_pRecordset->GetCollect("fengZu");
vLeiXing = m_pRecordset->GetCollect("leiXing");
vXieLv=m_pRecordset->GetCollect("xieLv");
nItem=m_list.InsertItem(0xffff,(_bstr_t)vArcTail);
m_list.SetItem(nItem,1,1,(_bstr_t)vArcHead,NULL,0,0,0);
m_list.SetItem(nItem,2,1,(_bstr_t)vFengZu,NULL,0,0,0);
m_list.SetItem(nItem,3,1,(_bstr_t)vFengLiang,NULL,0,0,0);
m_list.SetItem(nItem,4,1,(_bstr_t)vFengYa,NULL,0,0,0);
m_list.SetItem(nItem,5,1,(_bstr_t)vLeiXing,NULL,0,0,0);
m_list.SetItem(nItem,6,1,(_bstr_t)vXieLv,NULL,0,0,0);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
}
catch(_com_error e)///捕捉异常
{
CString str=e.ErrorMessage();
str=str+"读取数据库失败!";
AfxMessageBox(str);///显示错误信息
}*/
int nItem;
vHDName=m_hdmc;
vArcTail =m_strVexTail;
vArcHead =m_strVexHead;
vFengLiang =m_fengLiang;
vFengYa =m_fengYa;
vFengZu=m_fengZu;
vLeiXing=long(m_leiXing);
vXieLv=m_xieLv; //vId.lVal=vId.lVal+1;
nItem=m_list.InsertItem(0xffff,(_bstr_t)vHDName);
m_list.SetItem(nItem,1,1,(_bstr_t)vArcTail,NULL,0,0,0);
m_list.SetItem(nItem,2,1,(_bstr_t)vArcHead,NULL,0,0,0);
m_list.SetItem(nItem,3,1,(_bstr_t)vFengZu.fltVal,NULL,0,0,0);
m_list.SetItem(nItem,4,1,(_bstr_t)vFengLiang,NULL,0,0,0);
m_list.SetItem(nItem,5,1,(_bstr_t)vFengYa,NULL,0,0,0);
m_list.SetItem(nItem,6,1,(_bstr_t)vLeiXing,NULL,0,0,0);
m_list.SetItem(nItem,7,1,(_bstr_t)vXieLv,NULL,0,0,0);
m_strVexTail="";
m_strVexHead="";
m_fengYa=0;
m_xieLv=0;
m_fengZu=0;
m_fengLiang=0;
m_hdmc="";
UpdateData(false);
int listCount=m_list.GetItemCount();
if(listCount>=Net.arcNum)
{
m_insert.EnableWindow(false);
m_caculate.EnableWindow(true);
}
// inputCount++; //输入弧值的个数
/* if(m_list.GetItemCount()>=Net.arcNum)
{
CDialog::OnOK();
return;
}*/
m_vexTail.SetFocus();
}
CString CWeightInput::NameToId(CString name)
{
int intId;
CString strId="";
try{
CString str="SELECT * FROM vexTable where vexName='%s'",strSql;
strSql.Format(str,name);
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open(strSql.AllocSysString(),_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
_variant_t vOrderNum;
while(!m_pRecordset->adoEOF)
{
vOrderNum = m_pRecordset->GetCollect("id");
intId=vOrderNum.iVal;
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
}
catch(_com_error e){
AfxMessageBox(e.ErrorMessage());
}
// CString str="";;
strId.Format("%d",intId);
return strId;
}
void CWeightInput::OnCaculate()
{
//arcNum=m_intArcNum;
//arcNum=getArcNum();//得到弧的个数
//vexNum=getVexNum();//得到头结点的个数
int countLine,row_int,column_int,type,intRoad=0;//intRoad表示回路数;
CString strName,tailHead[MAX_VERTEX_NUM/2][2];//存放余树枝,[][0]放尾结点,[][1]放头结点
//countLine=m_inputVexValue.GetLineCount(); //顶点的值,IDC_INPUTVEX中的行数
// Dump every line of text of the edit control.
////////////////////////////////////////////////////////////////////
//初始化NET,G
try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM netDiagram",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
// m_bSuccess = TRUE;
while(!m_pRecordset->adoEOF)
{
vHDName=m_pRecordset->GetCollect("laneWayName");
vArcTail = m_pRecordset->GetCollect("arcTail");
vArcHead = m_pRecordset->GetCollect("arcHead");
vFengLiang = m_pRecordset->GetCollect("fengLiang");
vFengYa = m_pRecordset->GetCollect("fengYa");
vFengZu=m_pRecordset->GetCollect("fengZu");
vLeiXing = m_pRecordset->GetCollect("leiXing");
vXieLv=m_pRecordset->GetCollect("xieLv");
//////////////////
// row_int=locateVex(Net,NameToId((BSTR)vArcTail.pbstrVal));
row_int=locateVex(Net,(BSTR)vArcTail.pbstrVal);
column_int=locateVex(Net,(BSTR)vArcHead.pbstrVal);
/////////////////////
if(row_int>=0 && column_int>=0){
Net.arcs[row_int][column_int].fengZu=vFengZu.fltVal;
Net.arcs[row_int][column_int].fengLiang=vFengLiang.fltVal;
G.arcs[row_int][column_int].fengZu=G.arcs[column_int][row_int].fengZu=1;
Net.arcs[row_int][column_int].xieLv=vXieLv.fltVal;
Net.arcs[row_int][column_int].fengYa=vFengYa.fltVal;
Net.arcs[row_int][column_int].intArcType=vLeiXing.iVal;
Net.arcs[row_int][column_int].hdmc=vHDName.bstrVal;////
}
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
}
catch(_com_error e)///捕捉异常
{
CString str=e.ErrorMessage();
str=str+"读取数据库失败!";
AfxMessageBox(str);///显示错误信息
}
//////////////////////////////////////
//找回路个数
for( row_int=0;row_int<m_vexNum;row_int++)
for(column_int=0;column_int<m_vexNum;column_int++){
type=getType(row_int,column_int);
if(0==type)
{//如果分支为风机分支
tailHead[intRoad][0]=getVex(row_int);
tailHead[intRoad][1]=getVex(column_int);
setNull(row_int,column_int);//设置图的对应边为空
intRoad++;
}
else
if (1==type){//如果分支为固定分支
tailHead[intRoad][0]=getVex(row_int);
tailHead[intRoad][1]=getVex(column_int);
setNull(row_int,column_int);//设置图的对应边为空
intRoad++;
}
}
int intTemp=m_arcNum-m_vexNum+1-intRoad;//arcNum-vexNum+1 回路数
for(int k=0;k<intTemp;k++)
{//找一般分支中分阻大的直到找够回路数;剩下的分支构成生成树
int rowTemp=-1,columnTemp=-1;
float maxTemp=0;
for( row_int=0;row_int<m_vexNum;row_int++)
for(column_int=0;column_int<m_vexNum;column_int++)
{
if (getGraghValue(row_int,column_int)==1)
{//
//if (rowTemp!=-1)
//{
if(getFuZu(row_int,column_int)&&getFuZu(row_int,column_int)>maxTemp)
{
rowTemp=row_int;
columnTemp=column_int;
maxTemp=getFuZu(row_int,column_int);
}
// }
//else
//{
// rowTemp=row_int;
// columnTemp=column_int;
//}
}
}
tailHead[intRoad][0]=getVex(rowTemp);
tailHead[intRoad][1]=getVex(columnTemp);
setNull(rowTemp,columnTemp);//设置无向图的对应边为空
intRoad++;
}
//////////////加边生成回路
//TailHead存放余树枝[][0]放尾结点,[][1]放头结点
CString headNodestr,tailNodestr;
for(int i=0;i<intRoad;i++)
{
headNodestr=tailHead[i][1];
tailNodestr=tailHead[i][0];
findRoad(headNodestr,tailNodestr,i);
}
//////////////////////////////////////////////////////
//网络解算
int loopNum=m_arcNum-m_vexNum+1;
//loopNum回路个数
float fengLiang=0,fenZi=0,fenMu=0,fengZu=0,fengLiangXiuZheng=1;
int index=loopNum-1;
row_int=0;
column_int=0;
while (fabs(fengLiangXiuZheng)>=0.001){
//char *aa=new char[];
// aa[0]='0';
// aa="sdfasd";
// aa[0]='d';//出错!!!
// loopColumn=0;
//loopColumn=loop[index][1].GetLength();
for(int j=0;j<loopColumnNum[index];j++){
row_int=locateVex(Net,loop[index][j]);
column_int=locateVex(Net,loop[index][j+1]);
//取[row_int][column_int]弧的信息
//风阻初始化为负值,根据分支风阻值的正负可判断分支流向和回路流向是否相同
if(getFuZu(row_int,column_int)>=0){
fengLiang=getNetFengLiang(row_int,column_int);
fengZu=getFuZu(row_int,column_int);
}
else{
fengLiang=getNetFengLiang(column_int,row_int);
fengZu=-getFuZu(column_int,row_int);
}
fenZi+=fengZu*fengLiang*fengLiang;
fenMu+=fabs(fengZu*fengLiang);
}
if(getFengYa(row_int,column_int))//风机分支
{
fengLiangXiuZheng=-(fenZi-getFengYa(row_int,column_int))/(2*fenMu-getXieLv(row_int,column_int));//风量修正值
}
else
fengLiangXiuZheng=-fenZi/(2*fenMu);//风量修正值
//分子和分母初始化
fenZi=fenMu=0;
//计算回路中各分支的风量修正值
for(j=0;j<loopColumnNum[index];j++){
row_int=locateVex(Net,loop[index][j]);
column_int=locateVex(Net,loop[index][j+1]);
//取[row_int][column_int]弧的信息
//风阻初始化为负值,根据分支风阻值的正负可判断分支流向和回路流向是否相同
if(getFuZu(row_int,column_int)>=0){
setNetFengLiang(row_int,column_int,fengLiangXiuZheng);
}
else{
setNetFengLiang(column_int,row_int,-fengLiangXiuZheng);
}
}
index--;
if(index<0)
index=loopNum-1;
if (getFengYa(row_int,column_int)){
float fFengYa=5488+getXieLv(row_int,column_int)*getNetFengLiang(row_int,column_int);
setFengYa(row_int,column_int,fFengYa);
}
}// while (fabs(fengLiangXiuZheng)>=0.001)
////////////////
///输出网络计算结果
showNetResult.m_showEdit="";
CString strTemp;
float fTemp;
for( row_int=0;row_int<m_vexNum;row_int++)
for(column_int=0;column_int<m_vexNum;column_int++)
{
if(Net.arcs[row_int][column_int].hdmc!="")
if(Net.arcs[row_int][column_int].fengZu>0){
strTemp="";
showNetResult.m_showEdit+="巷道"+Net.arcs[row_int][column_int].hdmc+"的风量值:";
fTemp=Net.arcs[row_int][column_int].fengLiang;
strTemp.Format("%f",fTemp);
showNetResult.m_showEdit+=strTemp;
//if(Net.windDirection[row_int]){
showNetResult.m_showEdit+=" 风流的方向是从"+Net.vexs[row_int]+"到"+Net.vexs[column_int]+"\r\n\r\n";
//}
//else
// showNetResult.m_showEdit+=" 风流的方向是从"+Net.vexs[column_int]+"到"+Net.vexs[row_int]+"\r\n\r\n";
}
}
showNetResult.DoModal();
}
void CWeightInput::findRoad(CString headNode, CString tailNode, int index)
{//index表示回路序号0,1,2......
int row_int,column_int,loopColumn=0,loop_column=-1;
CString tempNode;
CStack* stack=new CStack();
stack->push(headNode);
row_int=locateGVex(headNode);
Net.visited[row_int]=true;
bool popFlag=true;
while(!stack->empty()||!popFlag)//栈为空和出栈标志为真时,结束
{
if (popFlag)
{
tempNode=stack->pop();
loop_column++;
loop[index][loop_column]=tempNode;
}
else {
loop[index][loop_column]="";
loop_column--;
tempNode=loop[index][loop_column];
}
// int j=loop[index].GetLength();
if(tempNode.Compare(tailNode)==0)
{//构成回路,函数结束
loop_column++;
loop[index][loop_column]=headNode;
loopColumnNum[index]=loop_column;
stack->destroyStack();
for (row_int=0;row_int <m_vexNum;row_int++)
Net.visited[row_int]=false;
return;
}
row_int=locateGVex(tempNode);
//在无向图中查找结点headNode的位置
bool findFlag=false;
// findFlag标志表示当headNode有邻结点时为真,
// 否则为假该节点不是回路中的,loop清除该节点
for(column_int=0;column_int<m_vexNum;column_int++)
{
if (getGraghValue(row_int,column_int)==1&&!Net.visited[column_int])
{
stack->push(getVex(column_int));
Net.visited[column_int]=true;
findFlag=true;
break;
}
}
if(!findFlag)
{
/// loopColumn++;
// }
// else
// //{
popFlag=false;
// loopColumn--;
}
else{
popFlag=true;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -